[PATCH] Do not parse members of incomplete class.

Serge Pavlov sepavloff at gmail.com
Wed Mar 18 21:22:59 PDT 2015


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/20150319/4fa4df7c/attachment.html>


More information about the cfe-commits mailing list