<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=NX1bEdjVlb2GmjJs-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>