<div dir="ltr">Would be good to get this into the Clang 7 release.</div><br><div class="gmail_quote"><div dir="ltr">On Tue, 7 Aug 2018 at 17:43, Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Tue Aug  7 17:42:42 2018<br>
New Revision: 339210<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=339210&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=339210&view=rev</a><br>
Log:<br>
PR38286: Don't crash when attempting to define a constructor for an<br>
incomplete class template.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
    cfe/trunk/test/SemaCXX/constructor.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=339210&r1=339209&r2=339210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=339210&r1=339209&r2=339210&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Aug  7 17:42:42 2018<br>
@@ -113,9 +113,15 @@ ParsedType Sema::getConstructorName(Iden<br>
       break;<br>
     }<br>
   }<br>
-  if (!InjectedClassName && CurClass->isInvalidDecl())<br>
+  if (!InjectedClassName) {<br>
+    if (!CurClass->isInvalidDecl()) {<br>
+      // FIXME: RequireCompleteDeclContext doesn't check dependent contexts<br>
+      // properly. Work around it here for now.<br>
+      Diag(SS.getLastQualifierNameLoc(),<br>
+           diag::err_incomplete_nested_name_spec) << CurClass << SS.getRange();<br>
+    }<br>
     return ParsedType();<br>
-  assert(InjectedClassName && "couldn't find injected class name");<br>
+  }<br>
<br>
   QualType T = Context.getTypeDeclType(InjectedClassName);<br>
   DiagnoseUseOfDecl(InjectedClassName, NameLoc);<br>
<br>
Modified: cfe/trunk/test/SemaCXX/constructor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constructor.cpp?rev=339210&r1=339209&r2=339210&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constructor.cpp?rev=339210&r1=339209&r2=339210&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/constructor.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/constructor.cpp Tue Aug  7 17:42:42 2018<br>
@@ -86,3 +86,14 @@ A::S::operator int() { return 1; }<br>
<br>
 A::S::~S() {}<br>
<br>
+namespace PR38286 {<br>
+  // FIXME: It'd be nice to give more consistent diagnostics for these cases<br>
+  // (but they're all failing for somewhat different reasons...).<br>
+  template<typename> struct A;<br>
+  template<typename T> A<T>::A() {} // expected-error {{incomplete type 'A' named in nested name specifier}}<br>
+  /*FIXME: needed to recover properly from previous error*/;<br>
+  template<typename> struct B;<br>
+  template<typename T> void B<T>::f() {} // expected-error {{out-of-line definition of 'f' from class 'B<type-parameter-0-0>'}}<br>
+  template<typename> struct C;<br>
+  template<typename T> C<T>::~C() {} // expected-error {{no type named 'C' in 'C<type-parameter-0-0>'}}<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>