[PATCH] Do not parse members of incomplete class.
Serge Pavlov
sepavloff at gmail.com
Wed Apr 15 11:52:35 PDT 2015
Ping.
Thanks,
--Serge
2015-03-19 10:22 GMT+06:00 Serge Pavlov <sepavloff at gmail.com>:
> Ping.
>
> Thanks,
> --Serge
>
> 2015-03-12 23:30 GMT+06:00 Serge Pavlov <sepavloff at gmail.com>:
>
>> 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/20150416/3e2f470a/attachment.html>
More information about the cfe-commits
mailing list