diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2013-06-25 23:22:23 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2013-06-25 23:22:23 +0000 |
commit | 7a2a4799d6508f4ce87ff472dbe70e59ca2370fc (patch) | |
tree | 85f97435724a142b692f6e3e3a8365cc563fd906 | |
parent | 502b0ed2641f790a4d6e8eac05932398d7362ad5 (diff) | |
download | bcm5719-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.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/cxx0x-nontrivial-union.cpp | 22 |
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>'}} +} |