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