]> granicus.if.org Git - clang/commitdiff
I concur with DPG here. This does indeed apply in 0x mode. Added test
authorChandler Carruth <chandlerc@gmail.com>
Fri, 22 Apr 2011 19:01:39 +0000 (19:01 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 22 Apr 2011 19:01:39 +0000 (19:01 +0000)
cases that demonstrates exactly why this does indeed apply in 0x mode.

If isPOD is currently broken in 0x mode, we should fix that directly
rather than papering over it here.

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

lib/Sema/SemaDecl.cpp
test/SemaCXX/scope-check.cpp

index e2e43c2912a0387bc056b26f87f1fc5f6783151b..611031b4bd3cda46305df40996e9b1aa88256dc1 100644 (file)
@@ -5235,7 +5235,7 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl,
 
     const RecordType *Record
       = Context.getBaseElementType(Type)->getAs<RecordType>();
-    if (Record && getLangOptions().CPlusPlus && !getLangOptions().CPlusPlus0x &&
+    if (Record && getLangOptions().CPlusPlus &&
         cast<CXXRecordDecl>(Record->getDecl())->isPOD()) {
       // C++03 [dcl.init]p9:
       //   If no initializer is specified for an object, and the
@@ -5248,7 +5248,6 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl,
       //   any, have an indeterminate initial value); if the object
       //   or any of its subobjects are of const-qualified type, the
       //   program is ill-formed.
-      // FIXME: DPG thinks it is very fishy that C++0x disables this.
     } else {
       // Check for jumps past the implicit initializer.  C++0x
       // clarifies that this applies to a "variable with automatic
index d462af06d730a8adc954232bbc7ae401f9c48d88..3a90cc08f6a20d0ae42a48d28e04978fd34d2772 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s -Wno-unreachable-code
+// RUN: %clang_cc1 -fsyntax-only -verify -fblocks -std=gnu++0x %s -Wno-unreachable-code
 
 namespace test0 {
   struct D { ~D(); };
@@ -151,3 +152,22 @@ namespace test8 {
   l2: x++;
   }
 }
+
+namespace test9 {
+  struct S { int i; };
+  void test1() {
+    goto foo;
+    S s;
+  foo:
+    return;
+  }
+  unsigned test2(unsigned x, unsigned y) {
+    switch (x) {
+    case 2:
+      S s;
+      if (y > 42) return x + y;
+    default:
+      return x - 2;
+    }
+  }
+}