[llvm] improve update_cc_test_checks.py for template (PR #102505)
Yaxun Liu via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 8 10:19:01 PDT 2024
https://github.com/yxsamliu created https://github.com/llvm/llvm-project/pull/102505
Teach update_cc_test_checks.py to add check line for template function instantiation.
>From 13cb72e8df0b6c27ce2d9ec3a0ce45e11083ac32 Mon Sep 17 00:00:00 2001
From: "Yaxun (Sam) Liu" <yaxun.liu at amd.com>
Date: Thu, 8 Aug 2024 12:46:19 -0400
Subject: [PATCH] improve update_cc_test_checks.py for template
Teach update_cc_test_checks.py to add check line for template function
instantiation.
---
llvm/utils/update_cc_test_checks.py | 50 ++++++++++++++++++-----------
1 file changed, 31 insertions(+), 19 deletions(-)
diff --git a/llvm/utils/update_cc_test_checks.py b/llvm/utils/update_cc_test_checks.py
index 3ffb07ddf6ad8..25c72e283cd9a 100755
--- a/llvm/utils/update_cc_test_checks.py
+++ b/llvm/utils/update_cc_test_checks.py
@@ -69,6 +69,7 @@ def parse_clang_ast_json(node, loc, search):
"TranslationUnitDecl",
"CXXRecordDecl",
"ClassTemplateSpecializationDecl",
+ "FunctionTemplateDecl",
):
# Specializations must use the loc from the specialization, not the
# template, and search for the class's spelling as the specialization
@@ -89,6 +90,7 @@ def parse_clang_ast_json(node, loc, search):
"CXXConstructorDecl",
"CXXDestructorDecl",
"CXXConversionDecl",
+ "FunctionTemplateDecl",
):
return
if loc is None:
@@ -105,25 +107,35 @@ def parse_clang_ast_json(node, loc, search):
)
return
- # If there is no 'inner' object, it is a function declaration and we can
- # skip it. However, function declarations may also contain an 'inner' list,
- # but in that case it will only contains ParmVarDecls. If we find an entry
- # that is not a ParmVarDecl, we know that this is a function definition.
- has_body = False
- if "inner" in node:
- for i in node["inner"]:
- if i.get("kind", "ParmVarDecl") != "ParmVarDecl":
- has_body = True
- break
- if not has_body:
- common.debug("Skipping function without body:", node["name"], "@", loc)
- return
- spell = node["name"]
- if search is None:
- search = spell
- mangled = node.get("mangledName", spell)
- ret[int(line) - 1].append((spell, mangled, search))
-
+ # If this is a FunctionTemplateDecl, we need to extract the mangled name
+ # of the template instantiation(s)
+ if node_kind == "FunctionTemplateDecl":
+ for inner in node.get("inner", []):
+ if inner["kind"] == "FunctionDecl":
+ spell = inner["name"]
+ mangled = inner.get("mangledName", spell)
+ if search is None:
+ search = spell
+ ret[int(line) - 1].append((spell, mangled, search))
+ else:
+ # If there is no 'inner' object, it is a function declaration and we can
+ # skip it. However, function declarations may also contain an 'inner' list,
+ # but in that case it will only contains ParmVarDecls. If we find an entry
+ # that is not a ParmVarDecl, we know that this is a function definition.
+ has_body = False
+ if "inner" in node:
+ for i in node["inner"]:
+ if i.get("kind", "ParmVarDecl") != "ParmVarDecl":
+ has_body = True
+ break
+ if not has_body:
+ common.debug("Skipping function without body:", node["name"], "@", loc)
+ return
+ spell = node["name"]
+ if search is None:
+ search = spell
+ mangled = node.get("mangledName", spell)
+ ret[int(line) - 1].append((spell, mangled, search))
ast = json.loads(stdout)
if ast["kind"] != "TranslationUnitDecl":
common.error("Clang AST dump JSON format changed?")
More information about the llvm-commits
mailing list