Author: sepavloff Date: Wed Jun 10 14:06:59 2015 New Revision: 239483 URL: http://llvm.org/viewvc/llvm-project?rev=239483&view=rev Log: Do not parse members of incomplete class.
If definition of a class is unknown and out-of-line definition of its member is encountered, do not parse the member declaration. This change fixes PR18542. Differential Revision: http://reviews.llvm.org/D8010 Modified: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/SemaCXX/incomplete-call.cpp Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=239483&r1=239482&r2=239483&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Jun 10 14:06:59 2015 @@ -4663,12 +4663,14 @@ NamedDecl *Sema::HandleDeclarator(Scope RequireCompleteDeclContext(D.getCXXScopeSpec(), DC)) return nullptr; + // If a class is incomplete, do not parse entities inside it. if (isa<CXXRecordDecl>(DC) && !cast<CXXRecordDecl>(DC)->hasDefinition()) { Diag(D.getIdentifierLoc(), diag::err_member_def_undefined_record) << Name << DC << D.getCXXScopeSpec().getRange(); - D.setInvalidType(); - } else if (!D.getDeclSpec().isFriendSpecified()) { + return nullptr; + } + if (!D.getDeclSpec().isFriendSpecified()) { if (diagnoseQualifiedDeclaration(D.getCXXScopeSpec(), DC, Name, D.getIdentifierLoc())) { if (DC->isRecord()) Modified: cfe/trunk/test/SemaCXX/incomplete-call.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/incomplete-call.cpp?rev=239483&r1=239482&r2=239483&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/incomplete-call.cpp (original) +++ cfe/trunk/test/SemaCXX/incomplete-call.cpp Wed Jun 10 14:06:59 2015 @@ -47,3 +47,15 @@ struct C; // expected-note{{forward decl void test_incomplete_object_call(C& c) { c(); // expected-error{{incomplete type in call to object of type}} } + +namespace pr18542 { + struct X { + int count; + template<typename CharT> class basic_istream; + template<typename CharT> + void basic_istream<CharT>::read() { // expected-error{{out-of-line definition of 'read' from class 'basic_istream<CharT>' without definition}} + count = 0; + } + }; +} + _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
