[llvm] improve update_cc_test_checks.py for template (PR #102505)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 8 10:19:49 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-testing-tools
Author: Yaxun (Sam) Liu (yxsamliu)
<details>
<summary>Changes</summary>
Teach update_cc_test_checks.py to add check line for template function instantiation.
---
Full diff: https://github.com/llvm/llvm-project/pull/102505.diff
1 Files Affected:
- (modified) llvm/utils/update_cc_test_checks.py (+31-19)
``````````diff
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?")
``````````
</details>
https://github.com/llvm/llvm-project/pull/102505
More information about the llvm-commits
mailing list