zeek/spicy

Unhelpful error message when "&" missing in chain

Closed this issue · 1 comments

This might be exactly the same issue/solution as in #1710, but I am not entirely sure - so I just filed it separately.

module Test;

type Share = unit {
};

public type Message = unit {
  %context = Share;

	sink alertsink;

	on %init {
		self.alertsink.connect(new Alert(self.context()));
	}
};

# note - this will mostly be garbage because it is encrypted.
public type Alert = unit(sh: Share&) {
  alerts: Alert_message(sh)[];
};

type Alert_message = unit(sh: Share) {
  level: uint8; # &convert=AlertLevel($$);
  description: uint8; # &convert=AlertDescription($$);
};

Generates the following error message:

$ spicyz test.spicy -o test.hlto
[error] /Users/johanna/spicy-test/test.spicy:18:3-18:30: type expects value_ref<const Share> for parameter 1, but receives value_ref<const Share>
[error] <Spicy support for Zeek>: aborting after errors

Adding a "&" to the Alert_message Share parameter fixes that. That being said, as a secondary issue - I am not even sure why the "&"'s are required. Removing it from the Alert unit results in this, similar, error message:

[error] /Users/johanna/spicy-test/test.spicy:12:26-12:50: type expects value_ref<const Share> for parameter 1, but receives value_ref<const Share>
[error] <Spicy support for Zeek>: aborting after errors

Oh, in related things to this - doing inout instead of & results in this error message:

$spicyz test.spicy -o test.hlto
In file included from /private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:6:
In file included from /Users/johanna/zeek/install/include/hilti/rt/libhilti.h:12:
In file included from /Users/johanna/zeek/install/include/hilti/rt/context.h:12:
In file included from /Users/johanna/zeek/install/include/hilti/rt/fiber.h:19:
/Users/johanna/zeek/install/include/hilti/rt/types/reference.h:720:31: error: no matching conversion for functional-style cast from '__hlt::Test::Share' to '__hlt::Test::Alert'
    return StrongReference<T>(T(std::forward<Args>(args)...));
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~
/private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:573:60: note: in instantiation of function template specialization 'hilti::rt::reference::make_strong<__hlt::Test::Alert, __hlt::Test::Share &>' requested here
    (*(*__self).alertsink).connect(::hilti::rt::reference::make_strong<__hlt::Test::Alert>((*(*__self).__context)));
                                                           ^
/private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:99:9: note: candidate constructor not viable: no known conversion from '__hlt::Test::Share' to 'const Alert' for 1st argument
        Alert(const Alert&) = default;
        ^
/private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:100:9: note: candidate constructor not viable: no known conversion from '__hlt::Test::Share' to 'Alert' for 1st argument
        Alert(Alert&&) = default;
        ^
/private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:176:19: note: candidate constructor not viable: no known conversion from '__hlt::Test::Share' to '::hilti::rt::ValueReference<__hlt::Test::Share> &' for 1st argument
    inline Alert::Alert(::hilti::rt::ValueReference<__hlt::Test::Share>& __p_sh) : __p_sh(std::move(__p_sh)) {
                  ^
/private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:179:19: note: candidate constructor not viable: no known conversion from '__hlt::Test::Share' to 'std::optional<std::optional< ::hilti::rt::Vector<__hlt::Test::Alert_message>>>' for 1st argument
    inline Alert::Alert(std::optional<std::optional<::hilti::rt::Vector<__hlt::Test::Alert_message>>> alerts) : Alert() {
                  ^
/private/var/folders/50/z8y2zkwd4lsdl3qr2l4shn8c0000gn/T/Test_5e7bb92ea7bd7a6c-17aab9b4f987eead.cc:173:19: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
    inline Alert::Alert() {
                  ^
1 error generated.
[error] <Spicy support for Zeek>: JIT compilation failed

Source:

module Test;

type Share = unit {
};

public type Message = unit {
  %context = Share;

	sink alertsink;

	on %init {
		self.alertsink.connect(new Alert(self.context()));
	}
};

# note - this will mostly be garbage because it is encrypted.
public type Alert = unit(inout sh: Share) {
  alerts: Alert_message(sh)[];
};

type Alert_message = unit(sh: Share) {
  level: uint8; # &convert=AlertLevel($$);
  description: uint8; # &convert=AlertDescription($$);
};