]> granicus.if.org Git - clang/commitdiff
Fix PR3001: if we have an error parsing an initializer, make sure to remove
authorChris Lattner <sabre@nondot.org>
Mon, 3 Nov 2008 09:28:22 +0000 (09:28 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 3 Nov 2008 09:28:22 +0000 (09:28 +0000)
the designator corresponding to it, otherwise Sema and later parsing will
get confused.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58603 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Designator.h
lib/Parse/ParseInit.cpp
test/Sema/init.c

index 52476383aebd5bbdc08d67e892f7be4209c00523..cf3f8777d554ed5f302b055900f4c170e812cc0d 100644 (file)
@@ -220,6 +220,17 @@ public:
         return &Designations[i];
     return 0;
   }
+
+  /// EraseDesignation - If there is a designator for the specified initializer
+  /// index, remove it.
+  void EraseDesignation(unsigned Idx) {
+    Designation *D =const_cast<Designation*>(getDesignationForInitializer(Idx));
+    if (D == 0) return;  // No designator.
+    
+    D->FreeExprs(Actions);
+    unsigned SlotNo = D-&Designations[0];
+    Designations.erase(Designations.begin()+SlotNo);
+  }
   
 };
 
index 82a33c21dadae560130ed45d3b4559f503a9e788..9b488566a6127d433502be414ae460f826d44491 100644 (file)
@@ -263,10 +263,18 @@ Parser::ExprResult Parser::ParseBraceInitializer() {
     ExprResult SubElt;
     if (!MayBeDesignationStart(Tok.getKind(), PP))
       SubElt = ParseInitializer();
-    else
+    else {
       SubElt = ParseInitializerWithPotentialDesignator(InitExprDesignations,
                                                        InitExprs.size());
-
+      
+      // If we had an erroneous initializer, and we had a potentially valid
+      // designator, make sure to remove the designator from
+      // InitExprDesignations, otherwise we'll end up with a designator with no
+      // making initializer.
+      if (SubElt.isInvalid)
+        InitExprDesignations.EraseDesignation(InitExprs.size());
+    }
+    
     // If we couldn't parse the subelement, bail out.
     if (!SubElt.isInvalid) {
       InitExprs.push_back(SubElt.Val);
index 9f91c42f44618ba6da13063003e1e29ee80816f0..a078a2a96bc6ff5aec593757641b335e02def691 100644 (file)
@@ -67,3 +67,10 @@ int sym_fw1a_scr[] = {
            ((int)(&((struct sym_reg *)0)->nc_gpreg)) & 0,
            8 * ((int)(&((struct sym_reg *)0)->nc_gpreg))
 };
+
+// PR3001
+struct s1 s2 = {
+    .a = sizeof(struct s3), // expected-error {{invalid application of 'sizeof'}}
+    .b = bogus // expected-error {{use of undeclared identifier 'bogus'}}
+}
+