From: Rico Tzschichholz Date: Thu, 16 Dec 2021 14:31:47 +0000 (+0100) Subject: vala: Allow unsafe assignment of integer to enum while reporting a notice X-Git-Tag: 0.54.6~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d2f3c7805a8c67b4ccefc14393e65415fecc8078;p=thirdparty%2Fvala.git vala: Allow unsafe assignment of integer to enum while reporting a notice --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 946be5eee..4ca5c8f57 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -343,6 +343,7 @@ TESTS = \ enums/in-invalid.test \ enums/no_gtype_to_string.vala \ enums/switch.vala \ + enums/unsafe-assignment.vala \ enums/bug614424.vala \ enums/bug666035.vala \ enums/bug666035-1.test \ diff --git a/tests/enums/unsafe-assignment.c-expected b/tests/enums/unsafe-assignment.c-expected new file mode 100644 index 000000000..5da9d05a8 --- /dev/null +++ b/tests/enums/unsafe-assignment.c-expected @@ -0,0 +1,67 @@ +/* enums_unsafe_assignment.c generated by valac, the Vala compiler + * generated from enums_unsafe_assignment.vala, do not modify */ + +#include + +#if !defined(VALA_EXTERN) +#if defined(_MSC_VER) +#define VALA_EXTERN __declspec(dllexport) extern +#elif __GNUC__ >= 4 +#define VALA_EXTERN __attribute__((visibility("default"))) extern +#else +#define VALA_EXTERN extern +#endif +#endif + +typedef enum { + FOO_BAR +} Foo; + +#define TYPE_FOO (foo_get_type ()) + +VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ; +static void _vala_main (void); + +static GType +foo_get_type_once (void) +{ + static const GEnumValue values[] = {{FOO_BAR, "FOO_BAR", "bar"}, {0, NULL, NULL}}; + GType foo_type_id; + foo_type_id = g_enum_register_static ("Foo", values); + return foo_type_id; +} + +GType +foo_get_type (void) +{ + static volatile gsize foo_type_id__volatile = 0; + if (g_once_init_enter (&foo_type_id__volatile)) { + GType foo_type_id; + foo_type_id = foo_get_type_once (); + g_once_init_leave (&foo_type_id__volatile, foo_type_id); + } + return foo_type_id__volatile; +} + +static void +_vala_main (void) +{ + { + Foo foo = 0; + foo = 23; + } + { + Foo foo = 0; + foo = FOO_BAR; + foo = 42; + } +} + +int +main (int argc, + char ** argv) +{ + _vala_main (); + return 0; +} + diff --git a/tests/enums/unsafe-assignment.vala b/tests/enums/unsafe-assignment.vala new file mode 100644 index 000000000..b5d3e0551 --- /dev/null +++ b/tests/enums/unsafe-assignment.vala @@ -0,0 +1,13 @@ +enum Foo { + BAR +} + +void main () { + { + Foo foo = 23; + } + { + Foo foo = Foo.BAR; + foo = 42; + } +} diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala index 137361b28..8c0948ef3 100644 --- a/vala/valaassignment.vala +++ b/vala/valaassignment.vala @@ -320,6 +320,10 @@ public class Vala.Assignment : Expression { error = true; Report.error (source_reference, "Assignment: Cannot convert from `%s' to `%s'", right.value_type.to_string (), left.value_type.to_string ()); return false; + } else if (left.value_type is EnumValueType && right.value_type is IntegerType + && (!(right is IntegerLiteral) || ((IntegerLiteral) right).value != "0")) { + //FIXME This will have to be an error in the future? + Report.notice (source_reference, "Assignment: Unsafe conversion from `%s' to `%s'", right.value_type.to_string (), left.value_type.to_string ()); } if (!(ma.symbol_reference is Property)) { diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala index 8ad4cc0cc..3b93688e5 100644 --- a/vala/valadatatype.vala +++ b/vala/valadatatype.vala @@ -323,6 +323,9 @@ public abstract class Vala.DataType : CodeNode { if (type_symbol is Enum && target_type.type_symbol is Struct && ((Struct) target_type.type_symbol).is_integer_type ()) { return true; + } else if (target_type.type_symbol is Enum && type_symbol is Struct && ((Struct) type_symbol).is_integer_type ()) { + //FIXME Drop this unsafe direction in the future? + return true; } // check for matching ownership of type-arguments diff --git a/vala/valalocalvariable.vala b/vala/valalocalvariable.vala index 024b046fe..e2a5c92c2 100644 --- a/vala/valalocalvariable.vala +++ b/vala/valalocalvariable.vala @@ -219,6 +219,10 @@ public class Vala.LocalVariable : Variable { error = true; Report.error (source_reference, "Assignment: Cannot convert from `%s' to `%s'", initializer.value_type.to_string (), variable_type.to_string ()); return false; + } else if (variable_type is EnumValueType && initializer.value_type is IntegerType + && (!(initializer is IntegerLiteral) || ((IntegerLiteral) initializer).value != "0")) { + //FIXME This will have to be an error in the future? + Report.notice (source_reference, "Assignment: Unsafe conversion from `%s' to `%s'", initializer.value_type.to_string (), variable_type.to_string ()); } if (variable_array_type != null && variable_array_type.inline_allocated && !variable_array_type.fixed_length && is_initializer_list) {