[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