Fix PR10531. Attach an initializer to anonymous unions, since the default constructor might not be trivial (if there is an in-class initializer for some member) and might be deleted.

llvm-svn: 139991
This commit is contained in:
Richard Smith 2011-09-18 00:06:34 +00:00
parent 7c29980d20
commit 4037235429
4 changed files with 53 additions and 11 deletions

View File

@ -2739,6 +2739,12 @@ Decl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS,
Record->getLocation(), /*IdentifierInfo=*/0,
Context.getTypeDeclType(Record),
TInfo, SC, SCAsWritten);
// Default-initialize the implicit variable. This initialization will be
// trivial in almost all cases, except if a union member has an in-class
// initializer:
// union { int n = 0; };
ActOnUninitializedDecl(Anon, /*TypeMayContainAuto=*/false);
}
Anon->setImplicit();

View File

@ -533,17 +533,6 @@ namespace test15 {
template void f<7>(S<7 + e>);
}
// rdar://problem/8125400. Don't crash.
namespace test16 {
static union {};
static union { union {}; };
static union { struct {}; };
static union { union { union {}; }; };
static union { union { struct {}; }; };
static union { struct { union {}; }; };
static union { struct { struct {}; }; };
}
// rdar://problem/8302148
namespace test17 {
template <int N> struct A {};

View File

@ -0,0 +1,35 @@
// RUN: %clang_cc1 %s -std=c++0x -emit-llvm -o - | FileCheck %s
// PR10531.
static union {
int a = 42;
char *b;
};
int f() { return a; }
// CHECK: define internal void @__cxx_global_var_init
// CHECK-NOT: }
// CHECK: call {{.*}}@"[[CONSTRUCT_GLOBAL:.*]]C1Ev"
int g() {
union {
int a;
int b = 81;
};
// CHECK: define {{.*}}_Z1gv
// CHECK-NOT: }
// CHECK: call {{.*}}@"[[CONSTRUCT_LOCAL:.*]]C1Ev"
return b;
}
// CHECK: define {{.*}}@"[[CONSTRUCT_LOCAL]]C2Ev"
// CHECK-NOT: }
// CHECK: store i32 81
// CHECK: define {{.*}}@"[[CONSTRUCT_GLOBAL]]C2Ev"
// CHECK-NOT: }
// CHECK: store i32 42

View File

@ -118,3 +118,15 @@ struct late_delete {
late_delete();
};
late_delete::late_delete() = default; // expected-error {{would delete it}}
// See also rdar://problem/8125400.
namespace empty {
static union {}; // expected-error {{deleted constructor}} expected-note {{here}}
static union { union {}; };
static union { struct {}; };
static union { union { union {}; }; };
static union { union { struct {}; }; };
static union { struct { union {}; }; }; // expected-error {{deleted constructor}} expected-note {{here}}
static union { struct { struct {}; }; };
}