Error duplicate declarations of a typedef name in the same scope.
authorPeter Crozier <peter@crozier.com>
Tue, 24 Mar 2020 14:35:21 +0000 (14:35 +0000)
committerPeter Crozier <peter@crozier.com>
Tue, 24 Mar 2020 14:35:21 +0000 (14:35 +0000)
frontends/verilog/verilog_lexer.l
frontends/verilog/verilog_parser.y

index bccdf48413c839d70386e5d934e2be30fea1b568..f6a3ac4db8f8ae5df0ae4ca9a90b3284df92ddb3 100644 (file)
@@ -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
index 1a195bbfd0278e5f46d1599e86efe7a14b08353e..d31740c6a1d4d4cb8f654b1a1b10316d70f0cb25 100644 (file)
@@ -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 <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_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 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: