[PATCH] Do not parse members of incomplete class.
Serge Pavlov
sepavloff at gmail.com
Thu Mar 12 10:30:23 PDT 2015
Any feedback?
Thanks,
--Serge
2015-03-02 23:54 GMT+06:00 Serge Pavlov <sepavloff at gmail.com>:
> 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/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150312/60bc4039/attachment.html>
More information about the cfe-commits
mailing list