[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">&lt;<a \
href="mailto:sepavloff@gmail.com" \
target="_blank">sepavloff@gmail.com</a>&gt;</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&#39;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&lt;typename T&gt; void f1() {<br>
+      int g1(int) noexcept(T::error); // expected-error{{type &#39;int&#39; cannot \
be used prior to &#39;::&#39; because it has no members}}<br> +   }<br>
+   template void f1&lt;int&gt;(); // expected-note{{in instantiation of function \
template specialization &#39;NondefDecls::f1&lt;int&gt;&#39; 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&lt;int&gt;::f(0); } // expected-note {{in instantiation of template \
class &#39;DR1635::X&lt;int&gt;&#39; requested here}}<br>  }<br>
+<br>
+namespace NondefDecls {<br>
+   template&lt;typename T&gt; void f1() {<br>
+      int g1(int defarg = T::error);   // expected-error{{type &#39;int&#39; cannot \
be used prior to &#39;::&#39; because it has no members}}<br> +   }<br>
+   template void f1&lt;int&gt;();   // expected-note{{in instantiation of function \
template specialization &#39;NondefDecls::f1&lt;int&gt;&#39; 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&lt;CXXRecordDecl&gt;(Tmpl-&gt;getDeclContext())) {<br>  if \
(Cls-&gt;isLocalClass())<br>  RequireInstantiation = true;<br>
</span>+      } else if (Tmpl-&gt;getLexicalDeclContext()-&gt;isFunctionOrMethod()) \
{<br> <span class="">+         // This is a non-defining declaration of a file scope \
function.<br> +         RequireInstantiation = true;<br>
        }<br>
        if (SemaRef.getLangOpts().CPlusPlus11 &amp;&amp;<br>
              EPI.ExceptionSpec.Type != EST_None &amp;&amp;<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-&gt;setDefaultArg(NewArg.get());<br>
</span>+      } else if \
(OwningFunc-&gt;getLexicalDeclContext()-&gt;isFunctionOrMethod()) {<br> <div \
class="HOEnZb"><div class="h5">+         // This is a function declaration within a \
function definition, as in:<br> +         //        template&lt;class T&gt; 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-&gt;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