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.48.21~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1cf69eb8afa3d9c0f5b3076e83d563d0c72a2bb0;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 7ce1b3b2e..396565164 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -330,6 +330,7 @@ TESTS = \ enums/in-inference.vala \ 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.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 241ba9568..b386f7c4c 100644 --- a/vala/valaassignment.vala +++ b/vala/valaassignment.vala @@ -314,6 +314,10 @@ public class Vala.Assignment : Expression { error = true; Report.error (source_reference, "Assignment: Cannot convert from `%s' to `%s'".printf (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'".printf (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 209a40821..b465fa0df 100644 --- a/vala/valadatatype.vala +++ b/vala/valadatatype.vala @@ -318,6 +318,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 b08f6f7ee..1e84abc4c 100644 --- a/vala/valalocalvariable.vala +++ b/vala/valalocalvariable.vala @@ -215,6 +215,10 @@ public class Vala.LocalVariable : Variable { error = true; Report.error (source_reference, "Assignment: Cannot convert from `%s' to `%s'".printf (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'".printf (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) {