diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a5092d5a389d..08e8cb798acb 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()) { diff --git a/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp b/clang/test/SemaCXX/cxx0x-nontrivial-union.cpp index 0e4add84955e..db296bd57d71 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(); } } + +namespace pr16061 { + struct X { X(); }; + + template struct Test1 { + union { + struct { + X x; + }; + }; + }; + + template struct Test2 { + union { + struct { // expected-note {{default constructor of 'Test2' is implicitly deleted because variant field '' has a non-trivial default constructor}} + T x; + }; + }; + }; + + Test2 t2x; // expected-error {{call to implicitly-deleted default constructor of 'Test2'}} +}