================
@@ -9314,10 +9314,36 @@ static void StripImplicitInstantiation(NamedDecl *D,
bool MinGW) {
FD->setInlineSpecified(false);
}
+/// Create an ExplicitInstantiationDecl to record source-location info for an
+/// explicit template instantiation statement, and add it to \p CurContext.
+static void addExplicitInstantiationDecl(
+ ASTContext &Context, DeclContext *CurContext, const CXXScopeSpec &SS,
+ NamedDecl *Spec, SourceLocation ExternLoc, SourceLocation TemplateLoc,
+ SourceLocation TagKWLoc, const ASTTemplateArgumentListInfo *ArgsAsWritten,
+ SourceLocation NameLoc, TypeSourceInfo *TypeAsWritten,
+ TemplateSpecializationKind TSK) {
+ NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
+ auto *EID = ExplicitInstantiationDecl::Create(
+ Context, CurContext, Spec, ExternLoc, TemplateLoc, TagKWLoc,
QualifierLoc,
+ ArgsAsWritten, NameLoc, TypeAsWritten, TSK);
+ CurContext->addDecl(EID);
+}
+
/// Compute the diagnostic location for an explicit instantiation
// declaration or definition.
static SourceLocation DiagLocForExplicitInstantiation(
NamedDecl* D, SourceLocation PointOfInstantiation) {
+ // Search for an ExplicitInstantiationDecl that references D. Per
+ // [temp.explicit], explicit instantiations must appear in an enclosing
+ // namespace of the template, so the EID is in D's DeclContext or an
ancestor.
+ for (DeclContext *DC = D->getDeclContext(); DC; DC = DC->getParent()) {
+ for (auto *Decl : DC->decls()) {
+ if (auto *EID = dyn_cast<ExplicitInstantiationDecl>(Decl))
+ if (EID->getSpecialization() == D)
+ return EID->getTemplateLoc();
+ }
+ }
----------------
16bit-ykiko wrote:
OK, I will make `ExplicitInstantiationDecl` redeclarable and add a map of
instantiated canonical decl -> `ExplicitInstantiationDecl` in ASTContext. .
https://github.com/llvm/llvm-project/pull/191658
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits