Merge pull request #1426 from larsclausen/enum-item-type-id-shadow
Support enum items shadowing type identifiers
This commit is contained in:
commit
025cbcc81f
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Check that enum item names can shadow visible type identifiers.
|
||||||
|
|
||||||
|
typedef int T;
|
||||||
|
typedef int U;
|
||||||
|
typedef int V;
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
reg failed;
|
||||||
|
|
||||||
|
`define check(value, expected, error) \
|
||||||
|
if ((value) !== (expected)) begin \
|
||||||
|
$display("FAILED(%0d). %s", `__LINE__, error); \
|
||||||
|
$display(" expected %0h, got %0h", expected, value); \
|
||||||
|
failed = 1'b1; \
|
||||||
|
end
|
||||||
|
|
||||||
|
enum {
|
||||||
|
T = 3,
|
||||||
|
U[2] = 5,
|
||||||
|
V[3:4] = 9
|
||||||
|
} e;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
failed = 1'b0;
|
||||||
|
|
||||||
|
e = T;
|
||||||
|
|
||||||
|
`check(e, 3, "Enum item name did not hide typedef");
|
||||||
|
`check(U0, 5, "Enum item sequence name did not hide typedef");
|
||||||
|
`check(U1, 6, "Enum item sequence value mismatch");
|
||||||
|
`check(V3, 9, "Enum item range name did not hide typedef");
|
||||||
|
`check(V4, 10, "Enum item range value mismatch");
|
||||||
|
|
||||||
|
if (!failed) begin
|
||||||
|
$display("PASSED");
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -387,6 +387,7 @@ sv_soft_packed_union_fail1 vvp_tests/sv_soft_packed_union_fail1.json
|
||||||
sv_super_member_fail vvp_tests/sv_super_member_fail.json
|
sv_super_member_fail vvp_tests/sv_super_member_fail.json
|
||||||
sv_type_identifier_ams_name_fields vvp_tests/sv_type_identifier_ams_name_fields.json
|
sv_type_identifier_ams_name_fields vvp_tests/sv_type_identifier_ams_name_fields.json
|
||||||
sv_type_identifier_config_name vvp_tests/sv_type_identifier_config_name.json
|
sv_type_identifier_config_name vvp_tests/sv_type_identifier_config_name.json
|
||||||
|
sv_type_identifier_enum_item_name vvp_tests/sv_type_identifier_enum_item_name.json
|
||||||
sv_type_identifier_foreach_name vvp_tests/sv_type_identifier_foreach_name.json
|
sv_type_identifier_foreach_name vvp_tests/sv_type_identifier_foreach_name.json
|
||||||
sv_type_identifier_function_name vvp_tests/sv_type_identifier_function_name.json
|
sv_type_identifier_function_name vvp_tests/sv_type_identifier_function_name.json
|
||||||
sv_type_identifier_genvar_name vvp_tests/sv_type_identifier_genvar_name.json
|
sv_type_identifier_genvar_name vvp_tests/sv_type_identifier_genvar_name.json
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"type" : "normal",
|
||||||
|
"source" : "sv_type_identifier_enum_item_name.v",
|
||||||
|
"iverilog-args" : [ "-g2005-sv" ],
|
||||||
|
"vlog95" : {
|
||||||
|
"__comment" : "Enums are SystemVerilog",
|
||||||
|
"type" : "CE"
|
||||||
|
}
|
||||||
|
}
|
||||||
9
parse.y
9
parse.y
|
|
@ -3276,20 +3276,23 @@ pos_neg_number
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/* Enum items are declaration names. Use identifier_name so an enum item can
|
||||||
|
shadow a visible type identifier without introducing a type/name
|
||||||
|
ambiguity. */
|
||||||
enum_name
|
enum_name
|
||||||
: IDENTIFIER initializer_opt
|
: identifier_name initializer_opt
|
||||||
{ perm_string name = lex_strings.make($1);
|
{ perm_string name = lex_strings.make($1);
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = make_named_number(@$, name, $2);
|
$$ = make_named_number(@$, name, $2);
|
||||||
}
|
}
|
||||||
| IDENTIFIER '[' pos_neg_number ']' initializer_opt
|
| identifier_name '[' pos_neg_number ']' initializer_opt
|
||||||
{ perm_string name = lex_strings.make($1);
|
{ perm_string name = lex_strings.make($1);
|
||||||
long count = check_enum_seq_value(@1, $3, false);
|
long count = check_enum_seq_value(@1, $3, false);
|
||||||
$$ = make_named_numbers(@$, name, 0, count-1, $5);
|
$$ = make_named_numbers(@$, name, 0, count-1, $5);
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
delete $3;
|
delete $3;
|
||||||
}
|
}
|
||||||
| IDENTIFIER '[' pos_neg_number ':' pos_neg_number ']' initializer_opt
|
| identifier_name '[' pos_neg_number ':' pos_neg_number ']' initializer_opt
|
||||||
{ perm_string name = lex_strings.make($1);
|
{ perm_string name = lex_strings.make($1);
|
||||||
$$ = make_named_numbers(@$, name, check_enum_seq_value(@1, $3, true),
|
$$ = make_named_numbers(@$, name, check_enum_seq_value(@1, $3, true),
|
||||||
check_enum_seq_value(@1, $5, true), $7);
|
check_enum_seq_value(@1, $5, true), $7);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue