From 9a8a644ad11e6fd95b6a1800e357e9cf282f5275 Mon Sep 17 00:00:00 2001 From: Peter Crozier Date: Tue, 24 Mar 2020 14:35:21 +0000 Subject: [PATCH] Error duplicate declarations of a typedef name in the same scope. --- frontends/verilog/verilog_lexer.l | 2 +- frontends/verilog/verilog_parser.y | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/frontends/verilog/verilog_lexer.l b/frontends/verilog/verilog_lexer.l index bccdf4841..f6a3ac4db 100644 --- a/frontends/verilog/verilog_lexer.l +++ b/frontends/verilog/verilog_lexer.l @@ -390,7 +390,7 @@ supply1 { return TOK_SUPPLY1; } if (pkg_user_types.count(s) > 0) { // package qualified typedefed name yylval->string = new std::string(s); - return TOK_USER_TYPE; + return TOK_PKG_USER_TYPE; } else { // backup before :: just return first part diff --git a/frontends/verilog/verilog_parser.y b/frontends/verilog/verilog_parser.y index 1a195bbfd..d31740c6a 100644 --- a/frontends/verilog/verilog_parser.y +++ b/frontends/verilog/verilog_parser.y @@ -154,6 +154,13 @@ static void exitTypeScope() 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) { auto range = new AstNode(AST_RANGE); @@ -196,7 +203,7 @@ static void addRange(AstNode *parent, int msb = 31, int lsb = 0, bool isSigned = %token TOK_STRING TOK_ID TOK_CONSTVAL TOK_REALVAL TOK_PRIMITIVE %token TOK_SVA_LABEL TOK_SPECIFY_OPER TOK_MSG_TASKS %token TOK_BASE TOK_BASED_CONSTVAL TOK_UNBASED_UNSIZED_CONSTVAL -%token TOK_USER_TYPE +%token TOK_USER_TYPE TOK_PKG_USER_TYPE %token TOK_ASSERT TOK_ASSUME TOK_RESTRICT TOK_COVER TOK_FINAL %token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END %token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM @@ -362,6 +369,7 @@ hierarchical_id: hierarchical_type_id: TOK_USER_TYPE + | TOK_PKG_USER_TYPE // package qualified type name | '(' TOK_USER_TYPE ')' { $$ = $2; } // non-standard grammar ; @@ -1637,7 +1645,7 @@ assign_expr: }; 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: