summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2013-06-25 23:22:23 +0000
committerNick Lewycky <nicholas@mxc.ca>2013-06-25 23:22:23 +0000
commit7a2a4799d6508f4ce87ff472dbe70e59ca2370fc (patch)
tree85f97435724a142b692f6e3e3a8365cc563fd906
parent502b0ed2641f790a4d6e8eac05932398d7362ad5 (diff)
downloadbcm5719-llvm-7a2a4799d6508f4ce87ff472dbe70e59ca2370fc.tar.gz
bcm5719-llvm-7a2a4799d6508f4ce87ff472dbe70e59ca2370fc.zip
Don't check for triviality on fields of templated records. We can't know the
answer until after instantiation. Fixes PR16061! llvm-svn: 184890
-rw-r--r--clang/lib/Sema/SemaDecl.cpp4
-rw-r--r--clang/test/SemaCXX/cxx0x-nontrivial-union.cpp22
2 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index a5092d5a389..08e8cb798ac 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -10748,8 +10748,8 @@ bool Sema::CheckNontrivialField(FieldDecl *FD) {
assert(FD);
assert(getLangOpts().CPlusPlus && "valid check only for C++");
- if (FD->isInvalidDecl())
- return true;
+ if (FD->isInvalidDecl() || FD->getType()->isDependentType())
+ return false;
QualType EltTy = Context.getBaseElementType(FD->getType());
if (const RecordType *RT = EltTy->getAs<RecordType>()) {
diff --git a/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp b/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp
index 0e4add84955..db296bd57d7 100644
--- a/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp
+++ b/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp
@@ -122,3 +122,25 @@ namespace optional {
o2 = optional<non_trivial>();
}
}
+
+namespace pr16061 {
+ struct X { X(); };
+
+ template<typename T> struct Test1 {
+ union {
+ struct {
+ X x;
+ };
+ };
+ };
+
+ template<typename T> struct Test2 {
+ union {
+ struct { // expected-note {{default constructor of 'Test2<pr16061::X>' is implicitly deleted because variant field '' has a non-trivial default constructor}}
+ T x;
+ };
+ };
+ };
+
+ Test2<X> t2x; // expected-error {{call to implicitly-deleted default constructor of 'Test2<pr16061::X>'}}
+}
OpenPOWER on IntegriCloud