Any feedback? Thanks, --Serge
2015-03-02 23:54 GMT+06:00 Serge Pavlov <[email protected]>: > 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. > > http://reviews.llvm.org/D8010 > > Files: > lib/Sema/SemaDecl.cpp > test/SemaCXX/incomplete-call.cpp > > Index: lib/Sema/SemaDecl.cpp > =================================================================== > --- lib/Sema/SemaDecl.cpp > +++ lib/Sema/SemaDecl.cpp > @@ -4573,12 +4573,14 @@ > 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()) > Index: test/SemaCXX/incomplete-call.cpp > =================================================================== > --- test/SemaCXX/incomplete-call.cpp > +++ test/SemaCXX/incomplete-call.cpp > @@ -47,3 +47,15 @@ > 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; > + } > + }; > +} > + > > EMAIL PREFERENCES > http://reviews.llvm.org/settings/panel/emailpreferences/ >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
