[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