[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-commits
Subject: Re: [PATCH] D11194: Instantiate function declarations in instantiated functions.
From: Serge Pavlov <sepavloff () gmail ! com>
Date: 2015-07-24 17:37:03
Message-ID: CACOhrX5iNq=5xq2pQDJ-inhtrc8S0U1kMxcrY5qqPg1c=0qbvw () mail ! gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
Ping.
Thanks,
--Serge
2015-07-16 23:38 GMT+06:00 Serge Pavlov <sepavloff@gmail.com>:
> sepavloff updated this revision to Diff 29921.
> sepavloff added a comment.
>
> Address reviewer's comments.
>
>
> http://reviews.llvm.org/D11194
>
> Files:
> lib/Sema/SemaTemplateInstantiate.cpp
> lib/Sema/SemaTemplateInstantiateDecl.cpp
> test/SemaTemplate/default-arguments.cpp
> test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
>
> Index: test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
> ===================================================================
> --- test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
> +++ test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
> @@ -178,3 +178,11 @@
> }
>
> }
> +
> +namespace NondefDecls {
> + template<typename T> void f1() {
> + int g1(int) noexcept(T::error); // expected-error{{type 'int' cannot
> be used prior to '::' because it has no members}}
> + }
> + template void f1<int>(); // expected-note{{in instantiation of function
> template specialization 'NondefDecls::f1<int>' requested here}}
> +}
> +
> Index: test/SemaTemplate/default-arguments.cpp
> ===================================================================
> --- test/SemaTemplate/default-arguments.cpp
> +++ test/SemaTemplate/default-arguments.cpp
> @@ -159,3 +159,10 @@
>
> int g() { X<int>::f(0); } // expected-note {{in instantiation of
> template class 'DR1635::X<int>' requested here}}
> }
> +
> +namespace NondefDecls {
> + template<typename T> void f1() {
> + int g1(int defarg = T::error); // expected-error{{type 'int' cannot
> be used prior to '::' because it has no members}}
> + }
> + template void f1<int>(); // expected-note{{in instantiation of
> function template specialization 'NondefDecls::f1<int>' requested here}}
> +}
> Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
> ===================================================================
> --- lib/Sema/SemaTemplateInstantiateDecl.cpp
> +++ lib/Sema/SemaTemplateInstantiateDecl.cpp
> @@ -3250,6 +3250,9 @@
> if (CXXRecordDecl *Cls =
> dyn_cast<CXXRecordDecl>(Tmpl->getDeclContext())) {
> if (Cls->isLocalClass())
> RequireInstantiation = true;
> + } else if (Tmpl->getLexicalDeclContext()->isFunctionOrMethod()) {
> + // This is a non-defining declaration of a file scope function.
> + RequireInstantiation = true;
> }
> if (SemaRef.getLangOpts().CPlusPlus11 &&
> EPI.ExceptionSpec.Type != EST_None &&
> Index: lib/Sema/SemaTemplateInstantiate.cpp
> ===================================================================
> --- lib/Sema/SemaTemplateInstantiate.cpp
> +++ lib/Sema/SemaTemplateInstantiate.cpp
> @@ -1691,6 +1691,16 @@
> ExprResult NewArg = SubstExpr(Arg, TemplateArgs);
> if (NewArg.isUsable())
> NewParm->setDefaultArg(NewArg.get());
> + } else if (OwningFunc->getLexicalDeclContext()->isFunctionOrMethod())
> {
> + // This is a function declaration within a function definition, as
> in:
> + // template<class T> void f() {
> + // void g(int x = T::v);
> + // }
> + Sema::ContextRAII SavedContext(*this, OwningFunc);
> + LocalInstantiationScope Local(*this);
> + ExprResult NewArg = SubstExpr(Arg, TemplateArgs);
> + if (NewArg.isUsable())
> + NewParm->setDefaultArg(NewArg.get());
> } else {
> // FIXME: if we non-lazily instantiated non-dependent default args
> for
> // non-dependent parameter types we could remove a bunch of
> duplicate
>
>
>
[Attachment #5 (text/html)]
<div dir="ltr">Ping.</div><div class="gmail_extra"><br clear="all"><div><div \
class="gmail_signature">Thanks,<br>--Serge<br></div></div> <br><div \
class="gmail_quote">2015-07-16 23:38 GMT+06:00 Serge Pavlov <span dir="ltr"><<a \
href="mailto:sepavloff@gmail.com" \
target="_blank">sepavloff@gmail.com</a>></span>:<br><blockquote \
class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc \
solid;padding-left:1ex">sepavloff updated this revision to Diff 29921.<br> sepavloff \
added a comment.<br> <br>
Address reviewer's comments.<br>
<div><div class="h5"><br>
<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11194&d \
=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=NX1bE \
djVlb2GmjJs-RDjs5rNZ3bd5xCj0QYnTpovHq0&s=-6wamuQVSkoYzlb4SofVdqVbu-uYrDf3osp33ilMtto&e=" \
rel="noreferrer" target="_blank">http://reviews.llvm.org/D11194</a><br> <br>
Files:<br>
lib/Sema/SemaTemplateInstantiate.cpp<br>
lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
test/SemaTemplate/default-arguments.cpp<br>
test/SemaTemplate/instantiate-exception-spec-cxx11.cpp<br>
<br>
Index: test/SemaTemplate/instantiate-exception-spec-cxx11.cpp<br>
===================================================================<br>
--- test/SemaTemplate/instantiate-exception-spec-cxx11.cpp<br>
+++ test/SemaTemplate/instantiate-exception-spec-cxx11.cpp<br>
@@ -178,3 +178,11 @@<br>
}<br>
<br>
}<br>
+<br>
+namespace NondefDecls {<br>
+ template<typename T> void f1() {<br>
+ int g1(int) noexcept(T::error); // expected-error{{type 'int' cannot \
be used prior to '::' because it has no members}}<br> + }<br>
+ template void f1<int>(); // expected-note{{in instantiation of function \
template specialization 'NondefDecls::f1<int>' requested here}}<br> \
+}<br> +<br>
Index: test/SemaTemplate/default-arguments.cpp<br>
===================================================================<br>
--- test/SemaTemplate/default-arguments.cpp<br>
+++ test/SemaTemplate/default-arguments.cpp<br>
@@ -159,3 +159,10 @@<br>
<br>
int g() { X<int>::f(0); } // expected-note {{in instantiation of template \
class 'DR1635::X<int>' requested here}}<br> }<br>
+<br>
+namespace NondefDecls {<br>
+ template<typename T> void f1() {<br>
+ int g1(int defarg = T::error); // expected-error{{type 'int' cannot \
be used prior to '::' because it has no members}}<br> + }<br>
+ template void f1<int>(); // expected-note{{in instantiation of function \
template specialization 'NondefDecls::f1<int>' requested here}}<br> \
+}<br>
Index: lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
===================================================================<br>
--- lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
+++ lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
</div></div>@@ -3250,6 +3250,9 @@<br>
<span class=""> if (CXXRecordDecl *Cls = \
dyn_cast<CXXRecordDecl>(Tmpl->getDeclContext())) {<br> if \
(Cls->isLocalClass())<br> RequireInstantiation = true;<br>
</span>+ } else if (Tmpl->getLexicalDeclContext()->isFunctionOrMethod()) \
{<br> <span class="">+ // This is a non-defining declaration of a file scope \
function.<br> + RequireInstantiation = true;<br>
}<br>
if (SemaRef.getLangOpts().CPlusPlus11 &&<br>
EPI.ExceptionSpec.Type != EST_None &&<br>
Index: lib/Sema/SemaTemplateInstantiate.cpp<br>
===================================================================<br>
--- lib/Sema/SemaTemplateInstantiate.cpp<br>
+++ lib/Sema/SemaTemplateInstantiate.cpp<br>
</span>@@ -1691,6 +1691,16 @@<br>
<span class=""> ExprResult NewArg = SubstExpr(Arg, TemplateArgs);<br>
if (NewArg.isUsable())<br>
NewParm->setDefaultArg(NewArg.get());<br>
</span>+ } else if \
(OwningFunc->getLexicalDeclContext()->isFunctionOrMethod()) {<br> <div \
class="HOEnZb"><div class="h5">+ // This is a function declaration within a \
function definition, as in:<br> + // template<class T> void f() \
{<br> + // void g(int x = T::v);<br>
+ // }<br>
+ Sema::ContextRAII SavedContext(*this, OwningFunc);<br>
+ LocalInstantiationScope Local(*this);<br>
+ ExprResult NewArg = SubstExpr(Arg, TemplateArgs);<br>
+ if (NewArg.isUsable())<br>
+ NewParm->setDefaultArg(NewArg.get());<br>
} else {<br>
// FIXME: if we non-lazily instantiated non-dependent default args for<br>
// non-dependent parameter types we could remove a bunch of duplicate<br>
<br>
<br>
</div></div></blockquote></div><br></div>
_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic