From cfe38c4db48f188db3f48dc48030d8be6f6e3e03 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Fri, 22 Apr 2011 19:01:39 +0000 Subject: [PATCH] I concur with DPG here. This does indeed apply in 0x mode. Added test 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 | 3 +-- test/SemaCXX/scope-check.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index e2e43c2912..611031b4bd 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -5235,7 +5235,7 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl, const RecordType *Record = Context.getBaseElementType(Type)->getAs(); - if (Record && getLangOptions().CPlusPlus && !getLangOptions().CPlusPlus0x && + if (Record && getLangOptions().CPlusPlus && cast(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 diff --git a/test/SemaCXX/scope-check.cpp b/test/SemaCXX/scope-check.cpp index d462af06d7..3a90cc08f6 100644 --- a/test/SemaCXX/scope-check.cpp +++ b/test/SemaCXX/scope-check.cpp @@ -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; + } + } +} -- 2.40.0