mirror of
https://github.com/frida/tinycc
synced 2025-01-06 20:12:00 +03:00
Fix type compatiblity of enums and ints
an enum must be compatible with one or more integer type, so adjust the test accordingly. That means the following redeclarations should work: enum e6 { E1 = -1, E0 }; void f3(enum e6); void f3(int); // should work as int and e6 are compatible while the following should not: void f4(enum e6 e); void f4(unsigned e); // should error as unsigned and e6 are incompatible
This commit is contained in:
parent
068d5b3d20
commit
9eef33993a
4
tccgen.c
4
tccgen.c
@ -3009,7 +3009,9 @@ static int compare_types(CType *type1, CType *type2, int unqualified)
|
|||||||
return (type1->ref == type2->ref);
|
return (type1->ref == type2->ref);
|
||||||
} else if (bt1 == VT_FUNC) {
|
} else if (bt1 == VT_FUNC) {
|
||||||
return is_compatible_func(type1, type2);
|
return is_compatible_func(type1, type2);
|
||||||
} else if (IS_ENUM(type1->t) || IS_ENUM(type2->t)) {
|
} else if (IS_ENUM(type1->t) && IS_ENUM(type2->t)) {
|
||||||
|
/* If both are enums then they must be the same, if only one is then
|
||||||
|
t1 and t2 must be equal, which was checked above already. */
|
||||||
return type1->ref == type2->ref;
|
return type1->ref == type2->ref;
|
||||||
} else {
|
} else {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -118,6 +118,13 @@ enum e5;
|
|||||||
void f3(enum e4 e);
|
void f3(enum e4 e);
|
||||||
void f3(enum e5 e);
|
void f3(enum e5 e);
|
||||||
|
|
||||||
|
#elif defined test_enum_compat_2
|
||||||
|
enum e6 { E1 = -1, E0 };
|
||||||
|
void f3(enum e6);
|
||||||
|
void f3(int); // should work as int and e6 are compatible
|
||||||
|
void f4(enum e6 e);
|
||||||
|
void f4(unsigned e); // should error as unsigned and e6 are incompatible
|
||||||
|
|
||||||
#elif defined test_ptr_to_str
|
#elif defined test_ptr_to_str
|
||||||
void f() { _Generic((int const *[]){0}, int:0); }
|
void f() { _Generic((int const *[]){0}, int:0); }
|
||||||
#elif defined test_fnptr_to_str
|
#elif defined test_fnptr_to_str
|
||||||
|
@ -46,73 +46,76 @@
|
|||||||
[test_enum_compat]
|
[test_enum_compat]
|
||||||
60_errors_and_warnings.c:119: error: incompatible types for redefinition of 'f3'
|
60_errors_and_warnings.c:119: error: incompatible types for redefinition of 'f3'
|
||||||
|
|
||||||
|
[test_enum_compat_2]
|
||||||
|
60_errors_and_warnings.c:126: error: incompatible types for redefinition of 'f4'
|
||||||
|
|
||||||
[test_ptr_to_str]
|
[test_ptr_to_str]
|
||||||
60_errors_and_warnings.c:122: error: type 'const int **' does not match any association
|
60_errors_and_warnings.c:129: error: type 'const int **' does not match any association
|
||||||
|
|
||||||
[test_fnptr_to_str]
|
[test_fnptr_to_str]
|
||||||
60_errors_and_warnings.c:124: error: type 'int (*(*)(float, char))(double, int)' does not match any association
|
60_errors_and_warnings.c:131: error: type 'int (*(*)(float, char))(double, int)' does not match any association
|
||||||
|
|
||||||
[test_array_to_str]
|
[test_array_to_str]
|
||||||
60_errors_and_warnings.c:126: error: type 'int (*)[3]' does not match any association
|
60_errors_and_warnings.c:133: error: type 'int (*)[3]' does not match any association
|
||||||
|
|
||||||
[test_duplicate_def_1]
|
[test_duplicate_def_1]
|
||||||
60_errors_and_warnings.c:128: error: redefinition of 'L'
|
60_errors_and_warnings.c:135: error: redefinition of 'L'
|
||||||
|
|
||||||
[test_duplicate_def_2]
|
[test_duplicate_def_2]
|
||||||
60_errors_and_warnings.c:131: error: redeclaration of 'L'
|
60_errors_and_warnings.c:138: error: redeclaration of 'L'
|
||||||
|
|
||||||
[test_abstract_decls]
|
[test_abstract_decls]
|
||||||
60_errors_and_warnings.c:141: error: identifier expected
|
60_errors_and_warnings.c:148: error: identifier expected
|
||||||
|
|
||||||
[test_invalid_1]
|
[test_invalid_1]
|
||||||
60_errors_and_warnings.c:146: error: identifier expected
|
60_errors_and_warnings.c:153: error: identifier expected
|
||||||
|
|
||||||
[test_invalid_2]
|
[test_invalid_2]
|
||||||
60_errors_and_warnings.c:149: error: ';' expected (got "{")
|
60_errors_and_warnings.c:156: error: ';' expected (got "{")
|
||||||
|
|
||||||
[test_invalid_3]
|
[test_invalid_3]
|
||||||
60_errors_and_warnings.c:153: error: ',' expected (got "a")
|
60_errors_and_warnings.c:160: error: ',' expected (got "a")
|
||||||
|
|
||||||
[test_invalid_4]
|
[test_invalid_4]
|
||||||
60_errors_and_warnings.c:157: error: division by zero in constant
|
60_errors_and_warnings.c:164: error: division by zero in constant
|
||||||
|
|
||||||
[test_conflicting_types]
|
[test_conflicting_types]
|
||||||
60_errors_and_warnings.c:163: error: incompatible types for redefinition of 'i'
|
60_errors_and_warnings.c:170: error: incompatible types for redefinition of 'i'
|
||||||
|
|
||||||
[test_nested_types]
|
[test_nested_types]
|
||||||
60_errors_and_warnings.c:170: error: struct/union/enum already defined
|
60_errors_and_warnings.c:177: error: struct/union/enum already defined
|
||||||
|
|
||||||
[test_vla_1]
|
[test_vla_1]
|
||||||
60_errors_and_warnings.c:177: error: need explicit inner array size in VLAs
|
60_errors_and_warnings.c:184: error: need explicit inner array size in VLAs
|
||||||
|
|
||||||
[test_invalid_alignas]
|
[test_invalid_alignas]
|
||||||
60_errors_and_warnings.c:181: error: identifier expected
|
60_errors_and_warnings.c:188: error: identifier expected
|
||||||
|
|
||||||
[test_static_assert]
|
[test_static_assert]
|
||||||
60_errors_and_warnings.c:187: error: ONE is not 1
|
60_errors_and_warnings.c:194: error: ONE is not 1
|
||||||
|
|
||||||
[test_static_assert_2]
|
[test_static_assert_2]
|
||||||
60_errors_and_warnings.c:191: error: 0 is 0
|
60_errors_and_warnings.c:198: error: 0 is 0
|
||||||
|
|
||||||
[test_static_assert_c2x]
|
[test_static_assert_c2x]
|
||||||
60_errors_and_warnings.c:195: error: _Static_assert fail
|
60_errors_and_warnings.c:202: error: _Static_assert fail
|
||||||
|
|
||||||
[test_void_array]
|
[test_void_array]
|
||||||
60_errors_and_warnings.c:198: error: declaration of an array of incomplete type elements
|
60_errors_and_warnings.c:205: error: declaration of an array of incomplete type elements
|
||||||
|
|
||||||
[test_incomplete_enum_array]
|
[test_incomplete_enum_array]
|
||||||
60_errors_and_warnings.c:201: error: declaration of an array of incomplete type elements
|
60_errors_and_warnings.c:208: error: declaration of an array of incomplete type elements
|
||||||
|
|
||||||
[test_incomplete_struct_array]
|
[test_incomplete_struct_array]
|
||||||
60_errors_and_warnings.c:204: error: declaration of an array of incomplete type elements
|
60_errors_and_warnings.c:211: error: declaration of an array of incomplete type elements
|
||||||
|
|
||||||
[test_const_fun_array]
|
[test_const_fun_array]
|
||||||
60_errors_and_warnings.c:208: error: declaration of an array of functions
|
60_errors_and_warnings.c:215: error: declaration of an array of functions
|
||||||
|
|
||||||
[test_incomplete_array_array]
|
[test_incomplete_array_array]
|
||||||
|
|
||||||
[test_extern_array]
|
[test_extern_array]
|
||||||
60_errors_and_warnings.c:224: error: incompatible types for redefinition of 'x'
|
60_errors_and_warnings.c:231: error: incompatible types for redefinition of 'x'
|
||||||
|
|
||||||
[test_func_1]
|
[test_func_1]
|
||||||
hello: a = 123
|
hello: a = 123
|
||||||
@ -121,17 +124,17 @@ hello: a = 123
|
|||||||
hello: a = 123
|
hello: a = 123
|
||||||
|
|
||||||
[test_func_3]
|
[test_func_3]
|
||||||
60_errors_and_warnings.c:254: warning: static storage ignored for redefinition of 'hello'
|
60_errors_and_warnings.c:261: warning: static storage ignored for redefinition of 'hello'
|
||||||
hello: a = 123
|
hello: a = 123
|
||||||
|
|
||||||
[test_func_4]
|
[test_func_4]
|
||||||
hello: a = 123
|
hello: a = 123
|
||||||
|
|
||||||
[test_func_5]
|
[test_func_5]
|
||||||
60_errors_and_warnings.c:254: error: incompatible types for redefinition of 'hello'
|
60_errors_and_warnings.c:261: error: incompatible types for redefinition of 'hello'
|
||||||
|
|
||||||
[test_func_6]
|
[test_func_6]
|
||||||
60_errors_and_warnings.c:242: error: function without file scope cannot be static
|
60_errors_and_warnings.c:249: error: function without file scope cannot be static
|
||||||
|
|
||||||
[test_var_1]
|
[test_var_1]
|
||||||
main : 1 ; 1
|
main : 1 ; 1
|
||||||
@ -144,12 +147,12 @@ main : 2 ; 2
|
|||||||
bar : 3 ; 3
|
bar : 3 ; 3
|
||||||
|
|
||||||
[test_var_3]
|
[test_var_3]
|
||||||
60_errors_and_warnings.c:286: error: incompatible types for redefinition of 'xxx'
|
60_errors_and_warnings.c:293: error: incompatible types for redefinition of 'xxx'
|
||||||
|
|
||||||
[test_var_4]
|
[test_var_4]
|
||||||
|
|
||||||
[test_long_double_type_for_win32]
|
[test_long_double_type_for_win32]
|
||||||
60_errors_and_warnings.c:317: warning: assignment from incompatible pointer type
|
60_errors_and_warnings.c:324: warning: assignment from incompatible pointer type
|
||||||
|
|
||||||
[test_stray_backslash]
|
[test_stray_backslash]
|
||||||
60_errors_and_warnings.c:323: error: stray '\' in program
|
60_errors_and_warnings.c:330: error: stray '\' in program
|
||||||
|
Loading…
Reference in New Issue
Block a user