Skip to content
Snippets Groups Projects
Commit d2f3c780 authored by Rico Tzschichholz's avatar Rico Tzschichholz
Browse files

vala: Allow unsafe assignment of integer to enum while reporting a notice

parent 734def5a
No related branches found
No related tags found
No related merge requests found
......@@ -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 \
......
/* enums_unsafe_assignment.c generated by valac, the Vala compiler
* generated from enums_unsafe_assignment.vala, do not modify */
#include <glib-object.h>
#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;
}
enum Foo {
BAR
}
void main () {
{
Foo foo = 23;
}
{
Foo foo = Foo.BAR;
foo = 42;
}
}
......@@ -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)) {
......
......@@ -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
......
......@@ -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) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment