[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