]> granicus.if.org Git - clang/commitdiff
add some simple designator testcases. Reject things like this:
authorChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 23:22:23 +0000 (23:22 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 23:22:23 +0000 (23:22 +0000)
struct foo Y[10] = {
  [4] .arr [2] 4  // expected-error {{expected '=' or another designator}}
};

because the "missing equals" extension only is valid if there
is exactly one array designator.

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

include/clang/Basic/DiagnosticKinds.def
include/clang/Parse/Designator.h
lib/Parse/ParseInit.cpp
test/Parser/designator.c [new file with mode: 0644]

index 96a5d0053d81b5009028ca334d86a4a91031eefc..9f59f947c690d7bdd4383788d2c3ac89be78b4dc 100644 (file)
@@ -311,6 +311,8 @@ DIAG(ext_gnu_array_range, EXTENSION,
      "use of GNU array range extension")
 DIAG(ext_gnu_missing_equal_designator, EXTENSION,
      "use of GNU 'missing =' extension in designator")
+DIAG(err_expected_equal_designator, ERROR,
+     "expected '=' or another designator")
 DIAG(ext_gnu_old_style_field_designator, EXTENSION,
      "use of GNU old-style field designator extension")
 DIAG(ext_gnu_case_range, EXTENSION,
index 613eef7f07eab52329ee9fee5ce9e7566b383f97..5abf70ddee04d590fcd8b1a01524c869de9f15c2 100644 (file)
@@ -151,7 +151,13 @@ public:
   /// AddDesignator - Add a designator to the end of this list.
   void AddDesignator(Designator D) {
     Designators.push_back(D);
-  }  
+  }
+  
+  unsigned getNumDesignators() const { return Designators.size(); }
+  const Designator &getDesignator(unsigned Idx) const {
+    assert(Idx < Designators.size());
+    return Designators[Idx];
+  }
   
   /// ClearExprs - Null out any expression references, which prevents them from
   /// being 'delete'd later.
index ed30f64d93967e375b3bb2bbae0d353b8e616ac3..f4d18fbb4cf507051744e64eddc59aeb76a1a2b9 100644 (file)
@@ -176,6 +176,7 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
   // at least one designator, because the only case we can get into this method
   // without a designator is when we have an objc message send.  That case is
   // handled and returned from above.
+  assert(Desig && "Designator didn't get created?");
   
   // Handle a normal designator sequence end, which is an equal.
   if (Tok.is(tok::equal)) {
@@ -184,15 +185,18 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
   }
   
   // We read some number of designators and found something that isn't an = or
-  // an initializer.  If we have exactly one array designator [TODO CHECK], this
+  // an initializer.  If we have exactly one array designator, this
   // is the GNU 'designation: array-designator' extension.  Otherwise, it is a
   // parse error.
-  SourceLocation Loc = Tok.getLocation();
-  ExprResult Init = ParseInitializer();
-  if (Init.isInvalid) return Init;
+  if (Desig->getNumDesignators() == 1 && 
+      (Desig->getDesignator(0).isArrayDesignator() ||
+       Desig->getDesignator(0).isArrayRangeDesignator())) {
+    Diag(Tok, diag::ext_gnu_missing_equal_designator);
+    return ParseInitializer();
+  }
   
-  Diag(Tok, diag::ext_gnu_missing_equal_designator);
-  return Init;
+  Diag(Tok, diag::err_expected_equal_designator);
+  return true;
 }
 
 
diff --git a/test/Parser/designator.c b/test/Parser/designator.c
new file mode 100644 (file)
index 0000000..d17f1b5
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: clang -fsyntax-only %s -verify -pedantic
+
+int X[] = {
+  [4]4,       // expected-warning {{use of GNU 'missing =' extension in designator}}
+  [5] = 7
+};
+
+struct foo {
+  int arr[10];
+};
+
+struct foo Y[10] = {
+  [4] .arr [2] = 4,
+
+  // This is not the GNU array init designator extension.
+  [4] .arr [2] 4  // expected-error {{expected '=' or another designator}}
+};