Error duplicate declarations of a typedef name in the same scope.

This commit is contained in:
Peter Crozier 2020-03-24 14:35:21 +00:00
parent ecc22f7fed
commit 9a8a644ad1
2 changed files with 11 additions and 3 deletions

View File

@ -390,7 +390,7 @@ supply1 { return TOK_SUPPLY1; }
if (pkg_user_types.count(s) > 0) { if (pkg_user_types.count(s) > 0) {
// package qualified typedefed name // package qualified typedefed name
yylval->string = new std::string(s); yylval->string = new std::string(s);
return TOK_USER_TYPE; return TOK_PKG_USER_TYPE;
} }
else { else {
// backup before :: just return first part // backup before :: just return first part

View File

@ -154,6 +154,13 @@ static void exitTypeScope()
user_type_stack.pop_back(); user_type_stack.pop_back();
} }
static bool isInLocalScope(const std::string *name)
{
// tests if a name was declared in the current block scope
auto user_types = user_type_stack.back();
return (user_types->count(*name) > 0);
}
static AstNode *makeRange(int msb = 31, int lsb = 0, bool isSigned = true) static AstNode *makeRange(int msb = 31, int lsb = 0, bool isSigned = true)
{ {
auto range = new AstNode(AST_RANGE); auto range = new AstNode(AST_RANGE);
@ -196,7 +203,7 @@ static void addRange(AstNode *parent, int msb = 31, int lsb = 0, bool isSigned =
%token <string> TOK_STRING TOK_ID TOK_CONSTVAL TOK_REALVAL TOK_PRIMITIVE %token <string> TOK_STRING TOK_ID TOK_CONSTVAL TOK_REALVAL TOK_PRIMITIVE
%token <string> TOK_SVA_LABEL TOK_SPECIFY_OPER TOK_MSG_TASKS %token <string> TOK_SVA_LABEL TOK_SPECIFY_OPER TOK_MSG_TASKS
%token <string> TOK_BASE TOK_BASED_CONSTVAL TOK_UNBASED_UNSIZED_CONSTVAL %token <string> TOK_BASE TOK_BASED_CONSTVAL TOK_UNBASED_UNSIZED_CONSTVAL
%token <string> TOK_USER_TYPE %token <string> TOK_USER_TYPE TOK_PKG_USER_TYPE
%token TOK_ASSERT TOK_ASSUME TOK_RESTRICT TOK_COVER TOK_FINAL %token TOK_ASSERT TOK_ASSUME TOK_RESTRICT TOK_COVER TOK_FINAL
%token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END %token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END
%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM %token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM
@ -362,6 +369,7 @@ hierarchical_id:
hierarchical_type_id: hierarchical_type_id:
TOK_USER_TYPE TOK_USER_TYPE
| TOK_PKG_USER_TYPE // package qualified type name
| '(' TOK_USER_TYPE ')' { $$ = $2; } // non-standard grammar | '(' TOK_USER_TYPE ')' { $$ = $2; } // non-standard grammar
; ;
@ -1637,7 +1645,7 @@ assign_expr:
}; };
type_name: TOK_ID // first time seen type_name: TOK_ID // first time seen
| TOK_USER_TYPE // redefinition | TOK_USER_TYPE { if (isInLocalScope($1)) frontend_verilog_yyerror("Duplicate declaration of TYPEDEF '%s'", $1->c_str()+1); }
; ;
typedef_decl: typedef_decl: