https://github.com/thebrandre updated https://github.com/llvm/llvm-project/pull/124409
From 1c829c6abcf6d2152088dce7799253bf94b77d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Brand?= <andre.br...@mailbox.org> Date: Wed, 22 Jan 2025 19:23:06 +0100 Subject: [PATCH 1/5] [clang] Add 'instantiated_from' for enums to the output of TextNodeDumper This enhances consistency with CXXRecordDecl and FunctionDecl, which also provide this information --- clang/lib/AST/TextNodeDumper.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp index 6da1f776b4b635..1dd6bf7bdd7e2d 100644 --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -2183,6 +2183,11 @@ void TextNodeDumper::VisitEnumDecl(const EnumDecl *D) { OS << " __module_private__"; if (D->isFixed()) dumpType(D->getIntegerType()); + + if (const auto *Instance = D->getInstantiatedFromMemberEnum()) { + OS << " instantiated_from"; + dumpPointer(Instance); + } } void TextNodeDumper::VisitRecordDecl(const RecordDecl *D) { From 839508504bdbf1282c3b98bc0a556d47fb7a04d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Brand?= <andre.br...@mailbox.org> Date: Thu, 30 Jan 2025 19:20:07 +0100 Subject: [PATCH 2/5] [clang] Refine test for instantiated_from of CXXMethodDecl --- clang/test/AST/ast-dump-decl.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp index e84241cee922f5..55e455ed7b2b20 100644 --- a/clang/test/AST/ast-dump-decl.cpp +++ b/clang/test/AST/ast-dump-decl.cpp @@ -328,9 +328,9 @@ namespace testClassTemplateDecl { // CHECK-NEXT: | | `-Destructor irrelevant non_trivial user_declared{{$}} // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:30> col:30 implicit referenced class TestClassTemplate{{$}} // CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-50]]:3, col:9> col:3 public{{$}} -// CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:23> col:5 TestClassTemplate<T> 'void ()'{{$}} -// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:24> col:5 ~TestClassTemplate<T> 'void ()' not_selected{{$}} -// CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:11> col:9 j 'int ()'{{$}} +// CHECK-NEXT: | |-CXXConstructorDecl 0x[[#%x,TEMPLATE_CONSTRUCTOR_DECL:]] <line:[[@LINE-50]]:5, col:23> col:5 TestClassTemplate<T> 'void ()'{{$}} +// CHECK-NEXT: | |-CXXDestructorDecl 0x[[#%x,TEMPLATE_DESTRUCTOR_DECL:]] <line:[[@LINE-50]]:5, col:24> col:5 ~TestClassTemplate<T> 'void ()' not_selected{{$}} +// CHECK-NEXT: | |-CXXMethodDecl 0x[[#%x,TEMPLATE_METHOD_DECL:]] <line:[[@LINE-50]]:5, col:11> col:9 j 'int ()'{{$}} // CHECK-NEXT: | `-FieldDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:9> col:9 i 'int'{{$}} // CHECK-NEXT: |-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-56]]:3, line:[[@LINE-50]]:3> line:[[@LINE-56]]:30 class TestClassTemplate definition implicit_instantiation{{$}} // CHECK-NEXT: | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init{{$}} @@ -345,9 +345,9 @@ namespace testClassTemplateDecl { // CHECK-NEXT: | | `-CXXRecord 0x{{.+}} 'A'{{$}} // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:30> col:30 implicit class TestClassTemplate{{$}} // CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-67]]:3, col:9> col:3 public{{$}} -// CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:23> col:5 used TestClassTemplate 'void ()' implicit_instantiation instantiated_from {{0x[^ ]+}}{{$}} -// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:24> col:5 used ~TestClassTemplate 'void () noexcept' implicit_instantiation instantiated_from {{0x[^ ]+}}{{$}} -// CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:11> col:9 j 'int ()' implicit_instantiation instantiated_from {{0x[^ ]+}}{{$}} +// CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:23> col:5 used TestClassTemplate 'void ()' implicit_instantiation instantiated_from 0x[[#TEMPLATE_CONSTRUCTOR_DECL]]{{$}} +// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:24> col:5 used ~TestClassTemplate 'void () noexcept' implicit_instantiation instantiated_from 0x[[#TEMPLATE_DESTRUCTOR_DECL]]{{$}} +// CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:11> col:9 j 'int ()' implicit_instantiation instantiated_from 0x[[#TEMPLATE_METHOD_DECL]]{{$}} // CHECK-NEXT: | |-FieldDecl 0x{{.+}} <line:[[@LINE-67]]:5, col:9> col:9 i 'int'{{$}} // CHECK-NEXT: | `-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-73]]:30> col:30 implicit constexpr TestClassTemplate 'void (const TestClassTemplate<A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}{{$}} // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:30> col:30 'const TestClassTemplate<A> &'{{$}} From 384e8008e9a9304de7fa2809d0c40ef7d2051122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Brand?= <andre.br...@mailbox.org> Date: Thu, 30 Jan 2025 19:20:29 +0100 Subject: [PATCH 3/5] [clang] Add tests for instantiated_from of EnumDecl --- clang/test/AST/ast-dump-decl.cpp | 161 +++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp index 55e455ed7b2b20..374ba43b1988bf 100644 --- a/clang/test/AST/ast-dump-decl.cpp +++ b/clang/test/AST/ast-dump-decl.cpp @@ -15,7 +15,9 @@ class testEnumDecl { enum TestEnumDeclFixed : int; }; // CHECK: EnumDecl{{.*}} class TestEnumDeclScoped 'int' +// CHECK-NOT: instantiated_from // CHECK: EnumDecl{{.*}} TestEnumDeclFixed 'int' +// CHECK-NOT: instantiated_from class testFieldDecl { int TestFieldDeclInit = 0; @@ -487,6 +489,165 @@ namespace testClassTemplateDecl { // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:41, col:48> col:48 implicit struct TestTemplateTemplateDefaultType{{$}} +namespace testClassTemplateDecl { + template<typename T> struct TestClassTemplateWithScopedMemberEnum { + enum class E1 : T { A, B, C, D }; + enum class E2 : int { A, B, C, D }; + enum class E3 : T; + enum class E4 : int; + }; + + template struct TestClassTemplateWithScopedMemberEnum<unsigned>; + + TestClassTemplateWithScopedMemberEnum<int> TestClassTemplateWithScopedMemberEnumObject; +} + +// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithScopedMemberEnum +// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-9]]:3> line:493:31 struct TestClassTemplateWithScopedMemberEnum definition +// CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init +// CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr +// CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit +// CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit +// CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit +// CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E1:]] <line:494:5, col:36> col:16 class E1 'T' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:28> col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' +// CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:34> col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E2:]] <line:495:5, col:38> col:16 class E2 'int' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:30> col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' +// CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:36> col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-30]]:5, col:21> col:16 class E3 'T' +// CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-30]]:5, col:21> col:16 class E4 'int' +// CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplateWithScopedMemberEnum' +// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-36]]:3, line:[[@LINE-31]]:3> line:[[@LINE-36]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation +// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init +// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr +// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param +// CHECK-NEXT: | |-MoveConstructor exists simple trivial +// CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit +// CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int' +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E3 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} +// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-51]]:31> col:31 implicit used constexpr TestClassTemplateWithScopedMemberEnum 'void () noexcept' inline default trivial +// CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:31> +// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplateWithScopedMemberEnum 'void (const TestClassTemplateWithScopedMemberEnum<int> &)' inline default trivial noexcept-unevaluated 0x{{.+}} +// CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:31> col:31 'const TestClassTemplateWithScopedMemberEnum<int> &' +// CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplateWithScopedMemberEnum 'void (TestClassTemplateWithScopedMemberEnum<int> &&)' inline default trivial noexcept-unevaluated 0x{{.+}} +// CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:31> col:31 'TestClassTemplateWithScopedMemberEnum<int> &&' + +// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-51]]:3, col:65> col:19 struct TestClassTemplateWithScopedMemberEnum definition explicit_instantiation_definition +// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init +// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr +// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit +// CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit +// CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit +// CHECK-NEXT: |-TemplateArgument type 'unsigned int' +// CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-68]]:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-68]]:5, col:21> col:16 class E1 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:28> col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:34> col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-72]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:30> col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:36> col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-76]]:5, col:21> col:16 class E3 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: `-EnumDecl 0x{{.+}} <line:[[@LINE-76]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} + +// CHECK: VarDecl 0x{{.+}} <{{.+}}:[[@LINE-73]]:3, col:46> col:46 TestClassTemplateWithScopedMemberEnumObject 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' callinit +// CHECK-NEXT: `-CXXConstructExpr 0x{{.+}} <col:46> 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' 'void () noexcept' + + +namespace testClassTemplateDecl { + template<typename T> struct TestClassTemplateWithUnscopedMemberEnum { + enum E1 : T { E1_A, E1_B, E1_C, E1_D }; + enum E2 : int { E2_A, E2_B, E2_C, E2_D }; + enum E3 : T; + enum E4 : int; + }; + + template struct TestClassTemplateWithUnscopedMemberEnum<unsigned>; + + TestClassTemplateWithUnscopedMemberEnum<unsigned> TestClassTemplateWithUnscopedMemberEnumObject; +} + +// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithUnscopedMemberEnum +// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-9]]:3> line:[[@LINE-14]]:31 struct TestClassTemplateWithUnscopedMemberEnum definition +// CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init +// CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr +// CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit +// CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit +// CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit +// CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithUnscopedMemberEnum +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E1:]] <line:[[@LINE-22]]:5, col:42> col:10 E1 'T' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:19> col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' +// CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:37> col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E2:]] <line:[[@LINE-26]]:5, col:44> col:10 E2 'int' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:21> col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' +// CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' +// CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:39> col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-30]]:5, col:15> col:10 E3 'T' +// CHECK-NEXT: | `-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-30]]:5, col:15> col:10 E4 'int' +// CHECK-NEXT: `-ClassTemplateSpecialization {{.+}} 'TestClassTemplateWithUnscopedMemberEnum' + +// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-30]]:3, col:67> col:19 struct TestClassTemplateWithUnscopedMemberEnum definition explicit_instantiation_definition +// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init +// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr +// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param +// CHECK-NEXT: | |-MoveConstructor exists simple trivial +// CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param +// CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit +// CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit +// CHECK-NEXT: |-TemplateArgument type 'unsigned int' +// CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-47]]:24, col:31> col:31 implicit struct TestClassTemplateWithUnscopedMemberEnum +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-47]]:5, col:15> col:10 E1 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:19> col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:37> col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-51]]:5, col:15> col:10 E2 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:21> col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:39> col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-55]]:5, col:15> col:10 E3 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-55]]:5, col:15> col:10 E4 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E4]]{{$}} +// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-53]]:19> col:19 implicit used constexpr TestClassTemplateWithUnscopedMemberEnum 'void () noexcept' inline default trivial +// CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:19> +// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:19> col:19 implicit constexpr TestClassTemplateWithUnscopedMemberEnum 'void (const TestClassTemplateWithUnscopedMemberEnum<unsigned int> &)' inline default trivial noexcept-unevaluated {{.+}} +// CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:19> col:19 'const TestClassTemplateWithUnscopedMemberEnum<unsigned int> &' +// CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} <col:19> col:19 implicit constexpr TestClassTemplateWithUnscopedMemberEnum 'void (TestClassTemplateWithUnscopedMemberEnum<unsigned int> &&)' inline default trivial noexcept-unevaluated {{.+}} +// CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:19> col:19 'TestClassTemplateWithUnscopedMemberEnum<unsigned int> &&' + +// CHECK: VarDecl {{.+}} <{{.+}}:[[@LINE-58]]:3, col:53> col:53 TestClassTemplateWithUnscopedMemberEnumObject 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' callinit +// CHECK-NEXT: `-CXXConstructExpr {{.+}} <col:53> 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' 'void () noexcept' + + // PR15220 dump instantiation only once namespace testCanonicalTemplate { class A {}; From 0735a473ae5c98cd95f329be8bc7721851091d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Brand?= <andre.br...@mailbox.org> Date: Thu, 30 Jan 2025 19:47:02 +0100 Subject: [PATCH 4/5] [clang] Avoid redundancy with previously tested class templates --- clang/test/AST/ast-dump-decl.cpp | 114 +++++++++---------------------- 1 file changed, 33 insertions(+), 81 deletions(-) diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp index 374ba43b1988bf..b3f930d57e2be9 100644 --- a/clang/test/AST/ast-dump-decl.cpp +++ b/clang/test/AST/ast-dump-decl.cpp @@ -502,17 +502,10 @@ namespace testClassTemplateDecl { TestClassTemplateWithScopedMemberEnum<int> TestClassTemplateWithScopedMemberEnumObject; } -// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithScopedMemberEnum +// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithScopedMemberEnum // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-9]]:3> line:493:31 struct TestClassTemplateWithScopedMemberEnum definition -// CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init -// CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr -// CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit -// CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit -// CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit -// CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum +// CHECK: | |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum // CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E1:]] <line:494:5, col:36> col:16 class E1 'T' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:28> col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' @@ -523,56 +516,36 @@ namespace testClassTemplateDecl { // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:30> col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:36> col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-30]]:5, col:21> col:16 class E3 'T' -// CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-30]]:5, col:21> col:16 class E4 'int' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-23]]:5, col:21> col:16 class E3 'T' +// CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-23]]:5, col:21> col:16 class E4 'int' // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplateWithScopedMemberEnum' -// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-36]]:3, line:[[@LINE-31]]:3> line:[[@LINE-36]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation -// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init -// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr -// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param -// CHECK-NEXT: | |-MoveConstructor exists simple trivial -// CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit -// CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit -// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-29]]:3, line:[[@LINE-24]]:3> line:[[@LINE-29]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation +// CHECK: |-TemplateArgument type 'int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int' // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E3 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} -// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-51]]:31> col:31 implicit used constexpr TestClassTemplateWithScopedMemberEnum 'void () noexcept' inline default trivial -// CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:31> -// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplateWithScopedMemberEnum 'void (const TestClassTemplateWithScopedMemberEnum<int> &)' inline default trivial noexcept-unevaluated 0x{{.+}} -// CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:31> col:31 'const TestClassTemplateWithScopedMemberEnum<int> &' -// CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplateWithScopedMemberEnum 'void (TestClassTemplateWithScopedMemberEnum<int> &&)' inline default trivial noexcept-unevaluated 0x{{.+}} -// CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:31> col:31 'TestClassTemplateWithScopedMemberEnum<int> &&' - -// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-51]]:3, col:65> col:19 struct TestClassTemplateWithScopedMemberEnum definition explicit_instantiation_definition -// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init -// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr -// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit -// CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit -// CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit -// CHECK-NEXT: |-TemplateArgument type 'unsigned int' +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E3 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} + +// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-31]]:3, col:65> col:19 struct TestClassTemplateWithScopedMemberEnum definition explicit_instantiation_definition +// CHECK: |-TemplateArgument type 'unsigned int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' -// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-68]]:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-68]]:5, col:21> col:16 class E1 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-41]]:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-41]]:5, col:21> col:16 class E1 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:28> col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:34> col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-72]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-45]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:30> col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:36> col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-76]]:5, col:21> col:16 class E3 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} -// CHECK-NEXT: `-EnumDecl 0x{{.+}} <line:[[@LINE-76]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-49]]:5, col:21> col:16 class E3 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: `-EnumDecl 0x{{.+}} <line:[[@LINE-49]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} -// CHECK: VarDecl 0x{{.+}} <{{.+}}:[[@LINE-73]]:3, col:46> col:46 TestClassTemplateWithScopedMemberEnumObject 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' callinit +// CHECK: VarDecl 0x{{.+}} <{{.+}}:[[@LINE-46]]:3, col:46> col:46 TestClassTemplateWithScopedMemberEnumObject 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' callinit // CHECK-NEXT: `-CXXConstructExpr 0x{{.+}} <col:46> 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' 'void () noexcept' @@ -589,62 +562,41 @@ namespace testClassTemplateDecl { TestClassTemplateWithUnscopedMemberEnum<unsigned> TestClassTemplateWithUnscopedMemberEnumObject; } -// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithUnscopedMemberEnum +// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithUnscopedMemberEnum // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-9]]:3> line:[[@LINE-14]]:31 struct TestClassTemplateWithUnscopedMemberEnum definition -// CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init -// CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr -// CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit -// CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit -// CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit -// CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithUnscopedMemberEnum -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E1:]] <line:[[@LINE-22]]:5, col:42> col:10 E1 'T' +// CHECK: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E1:]] <line:[[@LINE-14]]:5, col:42> col:10 E1 'T' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:19> col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:37> col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E2:]] <line:[[@LINE-26]]:5, col:44> col:10 E2 'int' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E2:]] <line:[[@LINE-18]]:5, col:44> col:10 E2 'int' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:21> col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:39> col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-30]]:5, col:15> col:10 E3 'T' -// CHECK-NEXT: | `-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-30]]:5, col:15> col:10 E4 'int' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-22]]:5, col:15> col:10 E3 'T' +// CHECK-NEXT: | `-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-22]]:5, col:15> col:10 E4 'int' // CHECK-NEXT: `-ClassTemplateSpecialization {{.+}} 'TestClassTemplateWithUnscopedMemberEnum' -// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-30]]:3, col:67> col:19 struct TestClassTemplateWithUnscopedMemberEnum definition explicit_instantiation_definition -// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init -// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr -// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param -// CHECK-NEXT: | |-MoveConstructor exists simple trivial -// CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param -// CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit -// CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit -// CHECK-NEXT: |-TemplateArgument type 'unsigned int' +// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-22]]:3, col:67> col:19 struct TestClassTemplateWithUnscopedMemberEnum definition explicit_instantiation_definition +// CHECK: |-TemplateArgument type 'unsigned int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' -// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-47]]:24, col:31> col:31 implicit struct TestClassTemplateWithUnscopedMemberEnum -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-47]]:5, col:15> col:10 E1 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-32]]:24, col:31> col:31 implicit struct TestClassTemplateWithUnscopedMemberEnum +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:15> col:10 E1 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:19> col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:37> col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-51]]:5, col:15> col:10 E2 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-36]]:5, col:15> col:10 E2 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:21> col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:39> col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-55]]:5, col:15> col:10 E3 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E3]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-55]]:5, col:15> col:10 E4 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E4]]{{$}} -// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-53]]:19> col:19 implicit used constexpr TestClassTemplateWithUnscopedMemberEnum 'void () noexcept' inline default trivial -// CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:19> -// CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:19> col:19 implicit constexpr TestClassTemplateWithUnscopedMemberEnum 'void (const TestClassTemplateWithUnscopedMemberEnum<unsigned int> &)' inline default trivial noexcept-unevaluated {{.+}} -// CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:19> col:19 'const TestClassTemplateWithUnscopedMemberEnum<unsigned int> &' -// CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} <col:19> col:19 implicit constexpr TestClassTemplateWithUnscopedMemberEnum 'void (TestClassTemplateWithUnscopedMemberEnum<unsigned int> &&)' inline default trivial noexcept-unevaluated {{.+}} -// CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:19> col:19 'TestClassTemplateWithUnscopedMemberEnum<unsigned int> &&' - -// CHECK: VarDecl {{.+}} <{{.+}}:[[@LINE-58]]:3, col:53> col:53 TestClassTemplateWithUnscopedMemberEnumObject 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' callinit +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-40]]:5, col:15> col:10 E3 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-40]]:5, col:15> col:10 E4 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E4]]{{$}} + +// CHECK: VarDecl {{.+}} <{{.+}}:[[@LINE-37]]:3, col:53> col:53 TestClassTemplateWithUnscopedMemberEnumObject 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' callinit // CHECK-NEXT: `-CXXConstructExpr {{.+}} <col:53> 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' 'void () noexcept' From 866e04a73062d216782676dcec91191535ce0788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Brand?= <andre.br...@mailbox.org> Date: Fri, 7 Feb 2025 07:08:23 +0100 Subject: [PATCH 5/5] [clang] Fix non-relative line numbers in AST dump test of EnumDecl --- clang/test/AST/ast-dump-decl.cpp | 48 +++++++++++++------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp index b3f930d57e2be9..d79051fb6efaa5 100644 --- a/clang/test/AST/ast-dump-decl.cpp +++ b/clang/test/AST/ast-dump-decl.cpp @@ -504,49 +504,45 @@ namespace testClassTemplateDecl { // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithScopedMemberEnum // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T -// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-9]]:3> line:493:31 struct TestClassTemplateWithScopedMemberEnum definition -// CHECK: | |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E1:]] <line:494:5, col:36> col:16 class E1 'T' +// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-9]]:3> line:[[@LINE-14]]:31 struct TestClassTemplateWithScopedMemberEnum definition +// CHECK: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E1:]] <line:[[@LINE-14]]:5, col:36> col:16 class E1 'T' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:28> col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:34> col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E2:]] <line:495:5, col:38> col:16 class E2 'int' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E2:]] <line:[[@LINE-18]]:5, col:38> col:16 class E2 'int' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:30> col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} <col:36> col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' -// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-23]]:5, col:21> col:16 class E3 'T' -// CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-23]]:5, col:21> col:16 class E4 'int' +// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-22]]:5, col:21> col:16 class E3 'T' +// CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-22]]:5, col:21> col:16 class E4 'int' // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplateWithScopedMemberEnum' -// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-29]]:3, line:[[@LINE-24]]:3> line:[[@LINE-29]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation +// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-28]]:3, line:[[@LINE-23]]:3> line:[[@LINE-28]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation // CHECK: |-TemplateArgument type 'int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int' -// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E3 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} +// CHECK: |-EnumDecl 0x{{.+}} <line:[[@LINE-30]]:5, col:21> col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-30]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-30]]:5, col:21> col:16 class E3 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-30]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} -// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-31]]:3, col:65> col:19 struct TestClassTemplateWithScopedMemberEnum definition explicit_instantiation_definition +// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-29]]:3, col:65> col:19 struct TestClassTemplateWithScopedMemberEnum definition explicit_instantiation_definition // CHECK: |-TemplateArgument type 'unsigned int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' -// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-41]]:24, col:31> col:31 implicit struct TestClassTemplateWithScopedMemberEnum -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-41]]:5, col:21> col:16 class E1 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK: |-EnumDecl 0x{{.+}} <line:[[@LINE-38]]:5, col:21> col:16 class E1 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:28> col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:34> col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E1' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-45]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-42]]:5, col:21> col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:30> col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:36> col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<unsigned int>::E2' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-49]]:5, col:21> col:16 class E3 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} -// CHECK-NEXT: `-EnumDecl 0x{{.+}} <line:[[@LINE-49]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E3 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: `-EnumDecl 0x{{.+}} <line:[[@LINE-46]]:5, col:21> col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} + -// CHECK: VarDecl 0x{{.+}} <{{.+}}:[[@LINE-46]]:3, col:46> col:46 TestClassTemplateWithScopedMemberEnumObject 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' callinit -// CHECK-NEXT: `-CXXConstructExpr 0x{{.+}} <col:46> 'TestClassTemplateWithScopedMemberEnum<int>':'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum<int>' 'void () noexcept' namespace testClassTemplateDecl { @@ -582,22 +578,18 @@ namespace testClassTemplateDecl { // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-22]]:3, col:67> col:19 struct TestClassTemplateWithUnscopedMemberEnum definition explicit_instantiation_definition // CHECK: |-TemplateArgument type 'unsigned int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' -// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <line:[[@LINE-32]]:24, col:31> col:31 implicit struct TestClassTemplateWithUnscopedMemberEnum -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-32]]:5, col:15> col:10 E1 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E1]]{{$}} +// CHECK: |-EnumDecl 0x{{.+}} <line:[[@LINE-31]]:5, col:15> col:10 E1 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:19> col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:25> col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:31> col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:37> col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E1' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-36]]:5, col:15> col:10 E2 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E2]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-35]]:5, col:15> col:10 E2 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:21> col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:27> col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} <col:33> col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} <col:39> col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>::E2' -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-40]]:5, col:15> col:10 E3 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E3]]{{$}} -// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-40]]:5, col:15> col:10 E4 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E4]]{{$}} - -// CHECK: VarDecl {{.+}} <{{.+}}:[[@LINE-37]]:3, col:53> col:53 TestClassTemplateWithUnscopedMemberEnumObject 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' callinit -// CHECK-NEXT: `-CXXConstructExpr {{.+}} <col:53> 'TestClassTemplateWithUnscopedMemberEnum<unsigned int>':'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum<unsigned int>' 'void () noexcept' +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-39]]:5, col:15> col:10 E3 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E3]]{{$}} +// CHECK-NEXT: |-EnumDecl 0x{{.+}} <line:[[@LINE-39]]:5, col:15> col:10 E4 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E4]]{{$}} // PR15220 dump instantiation only once _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits