[PATCH] Instantiate incomplete class used in template method.

Serge Pavlov sepavloff at gmail.com
Mon Mar 23 12:04:07 PDT 2015


Ping.

Thanks,
--Serge

2015-03-12 13:23 GMT+06:00 Serge Pavlov <sepavloff at gmail.com>:

> If class is absent from instantiation and is incomplete, instantiate it as
> incomplete class thus avoiding compiler crash.
> This change fixes PR18653.
>
> http://reviews.llvm.org/D8281
>
> Files:
>   lib/Sema/SemaTemplateInstantiate.cpp
>   lib/Sema/SemaTemplateInstantiateDecl.cpp
>   test/SemaTemplate/instantiate-local-class.cpp
>
> Index: lib/Sema/SemaTemplateInstantiate.cpp
> ===================================================================
> --- lib/Sema/SemaTemplateInstantiate.cpp
> +++ lib/Sema/SemaTemplateInstantiate.cpp
> @@ -2792,6 +2792,12 @@
>        isa<TemplateTemplateParmDecl>(D))
>      return nullptr;
>
> +  // If the declaration we are looking for is an incomplete type
> declaration, we
> +  // may not have a chance to instantiate it.
> +  if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
> +    if (TD->getTypeForDecl()->isIncompleteType())
> +      return nullptr;
> +
>    // If we didn't find the decl, then we either have a sema bug, or we
> have a
>    // forward reference to a label declaration.  Return null to indicate
> that
>    // we have an uninstantiated label.
> Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
> ===================================================================
> --- lib/Sema/SemaTemplateInstantiateDecl.cpp
> +++ lib/Sema/SemaTemplateInstantiateDecl.cpp
> @@ -4399,6 +4399,15 @@
>          isa<TemplateTemplateParmDecl>(D))
>        return D;
>
> +    // If the declaration we are looking for is an incomplete type
> declaration,
> +    // we may not have a chance to instantiate it.
> +    if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
> +      if (TD->getTypeForDecl()->isIncompleteType()) {
> +        Decl *Inst = SubstDecl(D, CurContext, TemplateArgs);
> +        CurrentInstantiationScope->InstantiatedLocal(D, Inst);
> +        return cast<TypeDecl>(Inst);
> +      }
> +
>      if (D->isInvalidDecl())
>        return nullptr;
>
> Index: test/SemaTemplate/instantiate-local-class.cpp
> ===================================================================
> --- test/SemaTemplate/instantiate-local-class.cpp
> +++ test/SemaTemplate/instantiate-local-class.cpp
> @@ -194,3 +194,13 @@
>    void f() { F<int>(); }
>  };
>  }
> +
> +namespace PR18653 {
> +  template <class T> void f();
> +  template <class T> struct str {
> +    void m() {
> +      f<class newclass>();
> +    }
> +  };
> +  template struct str<int>;
> +}
>
> 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/20150324/726a8847/attachment.html>


More information about the cfe-commits mailing list