diff options
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index ede1c5bcc64..ea0357a3359 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -483,15 +483,13 @@ bool Sema::DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, return false; } + if (!Complain || (PatternDef && PatternDef->isInvalidDecl())) + return true; QualType InstantiationTy; if (TagDecl *TD = dyn_cast<TagDecl>(Instantiation)) InstantiationTy = Context.getTypeDeclType(TD); - else - InstantiationTy = cast<FunctionDecl>(Instantiation)->getType(); - if (!Complain || (PatternDef && PatternDef->isInvalidDecl())) { - // Say nothing - } else if (PatternDef) { + if (PatternDef) { Diag(PointOfInstantiation, diag::err_template_instantiate_within_definition) << (TSK != TSK_ImplicitInstantiation) @@ -500,15 +498,30 @@ bool Sema::DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, // we're lexically inside it. Instantiation->setInvalidDecl(); } else if (InstantiatedFromMember) { - Diag(PointOfInstantiation, - diag::err_implicit_instantiate_member_undefined) - << InstantiationTy; - Diag(Pattern->getLocation(), diag::note_member_declared_at); + if (isa<FunctionDecl>(Instantiation)) { + Diag(PointOfInstantiation, + diag::err_explicit_instantiation_undefined_member) + << 1 << Instantiation->getDeclName() << Instantiation->getDeclContext(); + } else { + Diag(PointOfInstantiation, + diag::err_implicit_instantiate_member_undefined) + << InstantiationTy; + } + Diag(Pattern->getLocation(), isa<FunctionDecl>(Instantiation) + ? diag::note_explicit_instantiation_here + : diag::note_member_declared_at); } else { - Diag(PointOfInstantiation, diag::err_template_instantiate_undefined) - << (TSK != TSK_ImplicitInstantiation) - << InstantiationTy; - Diag(Pattern->getLocation(), diag::note_template_decl_here); + if (isa<FunctionDecl>(Instantiation)) + Diag(PointOfInstantiation, + diag::err_explicit_instantiation_undefined_func_template) + << Pattern; + else + Diag(PointOfInstantiation, diag::err_template_instantiate_undefined) + << (TSK != TSK_ImplicitInstantiation) + << InstantiationTy; + Diag(Pattern->getLocation(), isa<FunctionDecl>(Instantiation) + ? diag::note_explicit_instantiation_here + : diag::note_template_decl_here); } // In general, Instantiation isn't marked invalid to get more than one |