summaryrefslogtreecommitdiffstats
path: root/clang/utils/TableGen/ClangAttrEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/utils/TableGen/ClangAttrEmitter.cpp')
-rw-r--r--clang/utils/TableGen/ClangAttrEmitter.cpp44
1 files changed, 16 insertions, 28 deletions
diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp
index c516b53101f..990b860deae 100644
--- a/clang/utils/TableGen/ClangAttrEmitter.cpp
+++ b/clang/utils/TableGen/ClangAttrEmitter.cpp
@@ -2451,19 +2451,26 @@ void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS) {
OS << "#endif // ATTR_VISITOR_DECLS_ONLY\n";
}
-void EmitClangAttrTemplateInstantiateHelper(const std::vector<Record *> &Attrs,
- raw_ostream &OS,
- bool AppliesToDecl) {
+// Emits code to instantiate dependent attributes on templates.
+void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) {
+ emitSourceFileHeader("Template instantiation code for attributes", OS);
+
+ std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
+
+ OS << "namespace clang {\n"
+ << "namespace sema {\n\n"
+ << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, "
+ << "Sema &S,\n"
+ << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n"
+ << " switch (At->getKind()) {\n";
- OS << " switch (At->getKind()) {\n";
for (const auto *Attr : Attrs) {
const Record &R = *Attr;
if (!R.getValueAsBit("ASTNode"))
continue;
+
OS << " case attr::" << R.getName() << ": {\n";
- bool ShouldClone = R.getValueAsBit("Clone") &&
- (!AppliesToDecl ||
- R.getValueAsBit("MeaningfulToClassTemplateDefinition"));
+ bool ShouldClone = R.getValueAsBit("Clone");
if (!ShouldClone) {
OS << " return nullptr;\n";
@@ -2500,27 +2507,8 @@ void EmitClangAttrTemplateInstantiateHelper(const std::vector<Record *> &Attrs,
}
OS << " } // end switch\n"
<< " llvm_unreachable(\"Unknown attribute!\");\n"
- << " return nullptr;\n";
-}
-
-// Emits code to instantiate dependent attributes on templates.
-void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS) {
- emitSourceFileHeader("Template instantiation code for attributes", OS);
-
- std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
-
- OS << "namespace clang {\n"
- << "namespace sema {\n\n"
- << "Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, "
- << "Sema &S,\n"
- << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n";
- EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/false);
- OS << "}\n\n"
- << "Attr *instantiateTemplateAttributeForDecl(const Attr *At,\n"
- << " ASTContext &C, Sema &S,\n"
- << " const MultiLevelTemplateArgumentList &TemplateArgs) {\n";
- EmitClangAttrTemplateInstantiateHelper(Attrs, OS, /*AppliesToDecl*/true);
- OS << "}\n\n"
+ << " return nullptr;\n"
+ << "}\n\n"
<< "} // end namespace sema\n"
<< "} // end namespace clang\n";
}
OpenPOWER on IntegriCloud