[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