]> granicus.if.org Git - clang/commitdiff
Emit an extension diagnostic for C99 designated initializers that appear in C++ code
authorDouglas Gregor <dgregor@apple.com>
Sun, 16 Jan 2011 16:13:16 +0000 (16:13 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 16 Jan 2011 16:13:16 +0000 (16:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123582 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaInit.cpp
test/SemaCXX/c99.cpp

index 491df7f75d081e39f952e0c63e94ead25af1314d..f4cc7deedfc8f2e3caf16c50617154b72d7e4c09 100644 (file)
@@ -56,6 +56,8 @@ def err_variably_modified_new_type : Error<
   "'new' cannot allocate object of variably modified type %0">;
 
 // C99 Designated Initializers
+def ext_designated_init : Extension<
+  "designated initializers are a C99 feature, accepted in C++ as an extension">;
 def err_array_designator_negative : Error<
   "array designator value '%0' is negative">;
 def err_array_designator_empty_range : Error<
index e453b0a4edfdc81ad01aa1d3e1dc9cc3f27ca83d..23b061dd4c751c16f10200a9c11ca159889ba445 100644 (file)
@@ -1913,6 +1913,11 @@ ExprResult Sema::ActOnDesignatedInitializer(Designation &Desig,
                                  Designators.data(), Designators.size(),
                                  InitExpressions.data(), InitExpressions.size(),
                                  Loc, GNUSyntax, Init.takeAs<Expr>());
+  
+  if (getLangOptions().CPlusPlus)
+    Diag(DIE->getLocStart(), diag::ext_designated_init)
+      << DIE->getSourceRange();
+  
   return Owned(DIE);
 }
 
index b0bd45dea3d15e2c05d18496ed6eee1780faa547..cda069cf47fcc7f53945cb7fa560deef81741254 100644 (file)
@@ -1,3 +1,9 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
 void f1(int i[static 5]) { // expected-error{{C99}}
 }
+
+struct Point { int x; int y; };
+
+Point p1 = { .x = 17, // expected-warning{{designated initializers are a C99 feature, accepted in C++ as an extension}} 
+             y: 25 }; // expected-warning{{designated initializers are a C99 feature, accepted in C++ as an extension}} \
+                      // expected-warning{{use of GNU old-style field designator extension}}