From cefada305d4635c79feada2e23f75c2fb351d3e3 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Wed, 1 Oct 2025 15:54:08 -0700 Subject: [PATCH 1/2] [NFC][BoundsSafety] Fix `BoundsSafety/CodeGen/arithmetic-ops-in-counted-by-assign-O2.c` It seems that `@overflow_unsigned_count_size_index_trap` is now better optimized now as it skips the `mul` and `icmp` instructions before the trap. rdar://161199245 --- .../arithmetic-ops-in-counted-by-assign-O2.c | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/clang/test/BoundsSafety/CodeGen/arithmetic-ops-in-counted-by-assign-O2.c b/clang/test/BoundsSafety/CodeGen/arithmetic-ops-in-counted-by-assign-O2.c index f97ddcc39d0fd..51b8ebfa5a414 100644 --- a/clang/test/BoundsSafety/CodeGen/arithmetic-ops-in-counted-by-assign-O2.c +++ b/clang/test/BoundsSafety/CodeGen/arithmetic-ops-in-counted-by-assign-O2.c @@ -18,7 +18,7 @@ void count_ok(int *__counted_by(len - 2) buf, int len) { // CHECK-LABEL: @negative_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6:[0-9]+]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5:[0-9]+]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void negative_count_trap(int *__counted_by(len - 2) buf, int len) { @@ -30,7 +30,7 @@ void negative_count_trap(int *__counted_by(len - 2) buf, int len) { // CHECK-LABEL: @too_big_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void too_big_count_trap(int *__counted_by(len - 2) buf, int len) { @@ -42,7 +42,7 @@ void too_big_count_trap(int *__counted_by(len - 2) buf, int len) { // CHECK-LABEL: @overflow_unsigned_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void overflow_unsigned_count_trap(int *__counted_by(len - 2) buf, size_t len) { @@ -76,7 +76,7 @@ void local_count_ok_2(void) { // CHECK-LABEL: @local_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void local_count_trap(void) { @@ -89,7 +89,7 @@ void local_count_trap(void) { // CHECK-LABEL: @loob_local_count_trap( // CHECK-NEXT: entry: // CHECK-NEXT: [[ARR:%.*]] = alloca [10 x i32], align 4 -// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[ARR]]) #[[ATTR7:[0-9]+]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[ARR]]) #[[ATTR6:[0-9]+]] // CHECK-NEXT: [[UPPER:%.*]] = getelementptr inbounds nuw i8, ptr [[ARR]], i64 40 // CHECK-NEXT: [[BOUND_PTR_ARITH:%.*]] = getelementptr i8, ptr [[ARR]], i64 -4 // CHECK-NEXT: [[CMP_NOT:%.*]] = icmp ugt ptr [[BOUND_PTR_ARITH]], [[UPPER]], {{!annotation ![0-9]+}} @@ -97,10 +97,10 @@ void local_count_trap(void) { // CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP_NOT]], [[CMP16_NOT]], {{!annotation ![0-9]+}} // CHECK-NEXT: br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT:%.*]], {{!annotation ![0-9]+}} // CHECK: trap: -// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // CHECK: cont: -// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[ARR]]) #[[ATTR7]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr nonnull [[ARR]]) #[[ATTR6]] // CHECK-NEXT: ret void // void loob_local_count_trap(void) { @@ -111,7 +111,7 @@ void loob_local_count_trap(void) { // CHECK-LABEL: @uoob_local_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void uoob_local_count_trap(void) { @@ -122,7 +122,7 @@ void uoob_local_count_trap(void) { // CHECK-LABEL: @too_big_local_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void too_big_local_count_trap(void) { @@ -136,7 +136,7 @@ void too_big_local_count_trap(void) { // CHECK-LABEL: @overflow_local_unsigned_count_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void overflow_local_unsigned_count_trap(void) { @@ -159,7 +159,7 @@ void overflow_unsigned_count_size_ok(void *__sized_by(count * size) buf, size_t // CHECK-LABEL: @overflow_unsigned_count_size_trap2( // CHECK-NEXT: entry: -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void overflow_unsigned_count_size_trap2(void *__sized_by(count * size) buf, size_t count, size_t size) { @@ -174,10 +174,7 @@ void overflow_unsigned_count_size_trap2(void *__sized_by(count * size) buf, size // CHECK-LABEL: @overflow_unsigned_count_size_index_trap( // CHECK-NEXT: entry: -// CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SIZE:%.*]], [[COUNT:%.*]] -// CHECK-NEXT: [[CMP:%.*]] = icmp sgt i64 [[MUL]], -1 -// CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) -// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR6]], {{!annotation ![0-9]+}} +// CHECK-NEXT: tail call void @llvm.ubsantrap(i8 25) #[[ATTR5]], {{!annotation ![0-9]+}} // CHECK-NEXT: unreachable, {{!annotation ![0-9]+}} // void overflow_unsigned_count_size_index_trap(int *__counted_by(count * size) buf, size_t count, size_t size) { From 8e9076cb6a7b663840a7b69df4f4ee866744715b Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Wed, 1 Oct 2025 17:33:25 -0700 Subject: [PATCH 2/2] [NFC][BoundsSafety] Fix `clang/test/BoundsSafety/AST/attributes_in_template_decls_attr_only_mode.cpp` The AST dump for `ClassTemplateSpecializationDecl` AST nodes now has a `instantiated_from` property listed which broke the test. rdar://161199245 --- ...butes_in_template_decls_attr_only_mode.cpp | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/clang/test/BoundsSafety/AST/attributes_in_template_decls_attr_only_mode.cpp b/clang/test/BoundsSafety/AST/attributes_in_template_decls_attr_only_mode.cpp index 62aee2cdf8291..eb98cd7a6b6a6 100644 --- a/clang/test/BoundsSafety/AST/attributes_in_template_decls_attr_only_mode.cpp +++ b/clang/test/BoundsSafety/AST/attributes_in_template_decls_attr_only_mode.cpp @@ -291,7 +291,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | | `-CXXThisExpr {{.*}} 'RefParamMustBePtrGood *' implicit this // CHECK-NEXT:| | `-DeclRefExpr {{.*}} 'T__unsafe_indexable':'T' lvalue ParmVar {{.*}} 'v' 'T__unsafe_indexable':'T' // CHECK-NEXT:| |-ClassTemplateSpecialization {{.*}} 'RefParamMustBePtrGood' -// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:5:7 class RefParamMustBePtrGood definition implicit_instantiation +// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:5:7 class RefParamMustBePtrGood definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| | |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | | |-DefaultConstructor exists trivial // CHECK-NEXT:| | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -320,7 +320,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | | `-ParmVarDecl {{.*}} col:7 'const RefParamMustBePtrGood &' // CHECK-NEXT:| | `-CXXConstructorDecl {{.*}} col:7 implicit constexpr RefParamMustBePtrGood 'void (RefParamMustBePtrGood &&)' inline default trivial noexcept-unevaluated {{.*}} // CHECK-NEXT:| | `-ParmVarDecl {{.*}} col:7 'RefParamMustBePtrGood &&' -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:5:7 class RefParamMustBePtrGood definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:5:7 class RefParamMustBePtrGood definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -414,7 +414,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:|-TypeAliasDecl {{.*}} col:7 referenced PtrTypedef 'char *' // CHECK-NEXT:| `-PointerType {{.*}} 'char *' // CHECK-NEXT:| `-BuiltinType {{.*}} 'char' -// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:7 class RefParamMustBePtrGood definition explicit_instantiation_definition +// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:7 class RefParamMustBePtrGood definition instantiated_from {{.*}} explicit_instantiation_definition // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param @@ -510,7 +510,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | |-FieldDecl {{.*}} col:17 ptr0 'T *__single':'T *' // CHECK-NEXT:| | `-FieldDecl {{.*}} col:27 pt1 'T *__unsafe_indexable':'T *' // CHECK-NEXT:| |-ClassTemplateSpecialization {{.*}} 'RefParamIsPointee' -// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:89:7 class RefParamIsPointee definition implicit_instantiation +// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:89:7 class RefParamIsPointee definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| | |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | | |-DefaultConstructor exists trivial // CHECK-NEXT:| | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -530,7 +530,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | | `-ParmVarDecl {{.*}} col:7 'const RefParamIsPointee &' // CHECK-NEXT:| | `-CXXConstructorDecl {{.*}} col:7 implicit constexpr RefParamIsPointee 'void (RefParamIsPointee &&)' inline default trivial noexcept-unevaluated {{.*}} // CHECK-NEXT:| | `-ParmVarDecl {{.*}} col:7 'RefParamIsPointee &&' -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:89:7 class RefParamIsPointee definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:89:7 class RefParamIsPointee definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -551,7 +551,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-ParmVarDecl {{.*}} col:7 'const RefParamIsPointee &' // CHECK-NEXT:| `-CXXConstructorDecl {{.*}} col:7 implicit constexpr RefParamIsPointee 'void (RefParamIsPointee &&)' inline default trivial noexcept-unevaluated {{.*}} // CHECK-NEXT:| `-ParmVarDecl {{.*}} col:7 'RefParamIsPointee &&' -// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:16 class RefParamIsPointee definition explicit_instantiation_definition +// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:16 class RefParamIsPointee definition instantiated_from {{.*}} explicit_instantiation_definition // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param @@ -593,7 +593,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | |-DeclRefExpr {{.*}} 'T__single':'T' lvalue Var {{.*}} 'tmp' 'T__single':'T' // CHECK-NEXT:| | `-CXXNullPtrLiteralExpr {{.*}} 'std::nullptr_t' // CHECK-NEXT:| |-ClassTemplateSpecialization {{.*}} 'TInMethodBodyGood' -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:108:7 class TInMethodBodyGood definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:108:7 class TInMethodBodyGood definition instantiated_from {{.*}} 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 @@ -620,7 +620,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-ParmVarDecl {{.*}} col:7 'const TInMethodBodyGood &' // CHECK-NEXT:| `-CXXConstructorDecl {{.*}} col:7 implicit constexpr TInMethodBodyGood 'void (TInMethodBodyGood &&)' inline default trivial noexcept-unevaluated {{.*}} // CHECK-NEXT:| `-ParmVarDecl {{.*}} col:7 'TInMethodBodyGood &&' -// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:16 class TInMethodBodyGood definition explicit_instantiation_definition +// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:16 class TInMethodBodyGood definition instantiated_from {{.*}} 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 @@ -693,7 +693,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-VarDecl {{.*}} col:30 tmp 'T__unsafe_indexable':'T' cinit // CHECK-NEXT:| | `-MemberExpr {{.*}} 'U const__unsafe_indexable':'const U' lvalue ->ptr1 {{.*}} // CHECK-NEXT:| | `-CXXThisExpr {{.*}} 'const RefParamMustBePtrGoodPartialBase *' implicit this -// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:132:7 class RefParamMustBePtrGoodPartialBase definition implicit_instantiation +// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:132:7 class RefParamMustBePtrGoodPartialBase definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| | |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param @@ -719,7 +719,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | |-CXXMethodDecl {{.*}} col:7 get_counter 'int () const' implicit_instantiation implicit-inline instantiated_from {{.*}} // CHECK-NEXT:| | |-CXXMethodDecl {{.*}} line:142:10 useT 'void () const' implicit_instantiation implicit-inline instantiated_from {{.*}} // CHECK-NEXT:| | `-CXXMethodDecl {{.*}} line:146:10 useU 'void () const' implicit_instantiation implicit-inline instantiated_from {{.*}} -// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:132:7 class RefParamMustBePtrGoodPartialBase definition implicit_instantiation +// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:132:7 class RefParamMustBePtrGoodPartialBase definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| | |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param @@ -745,7 +745,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | |-CXXMethodDecl {{.*}} col:7 get_counter 'int () const' implicit_instantiation implicit-inline instantiated_from {{.*}} // CHECK-NEXT:| | |-CXXMethodDecl {{.*}} line:142:10 useT 'void () const' implicit_instantiation implicit-inline instantiated_from {{.*}} // CHECK-NEXT:| | `-CXXMethodDecl {{.*}} line:146:10 useU 'void () const' implicit_instantiation implicit-inline instantiated_from {{.*}} -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:132:7 class RefParamMustBePtrGoodPartialBase definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:132:7 class RefParamMustBePtrGoodPartialBase definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -799,7 +799,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-MemberExpr {{.*}} 'T__single':'T' lvalue ->ptr2 {{.*}} // CHECK-NEXT:| | `-CXXThisExpr {{.*}} 'RefParamMustBePtrGoodPartialT *' implicit this // CHECK-NEXT:| |-ClassTemplateSpecialization {{.*}} 'RefParamMustBePtrGoodPartialT' -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:153:7 class RefParamMustBePtrGoodPartialT definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:153:7 class RefParamMustBePtrGoodPartialT definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate trivially_copyable trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -845,7 +845,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-MemberExpr {{.*}} 'U__unsafe_indexable':'U' lvalue ->ptr2 {{.*}} // CHECK-NEXT:| | `-CXXThisExpr {{.*}} 'RefParamMustBePtrGoodPartialU *' implicit this // CHECK-NEXT:| |-ClassTemplateSpecialization {{.*}} 'RefParamMustBePtrGoodPartialU' -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:161:7 class RefParamMustBePtrGoodPartialU definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:161:7 class RefParamMustBePtrGoodPartialU definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate trivially_copyable trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -890,7 +890,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| `-ReturnStmt {{.*}} // CHECK-NEXT:| `-MemberExpr {{.*}} 'V__single':'V' lvalue ->ptr2 {{.*}} // CHECK-NEXT:| `-CXXThisExpr {{.*}} 'RefParamMustBePtrGoodPartialV *' implicit this -// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:7 class RefParamMustBePtrGoodPartialT definition explicit_instantiation_definition +// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:7 class RefParamMustBePtrGoodPartialT definition instantiated_from {{.*}} explicit_instantiation_definition // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate trivially_copyable trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param @@ -912,7 +912,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| `-ImplicitCastExpr {{.*}} 'float *__single':'float *' // CHECK-NEXT:| `-MemberExpr {{.*}} 'float *__single':'float *' lvalue ->ptr2 {{.*}} // CHECK-NEXT:| `-CXXThisExpr {{.*}} 'RefParamMustBePtrGoodPartialT *' implicit this -// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:7 class RefParamMustBePtrGoodPartialU definition explicit_instantiation_definition +// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:7 class RefParamMustBePtrGoodPartialU definition instantiated_from {{.*}} explicit_instantiation_definition // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate trivially_copyable trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param @@ -998,7 +998,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-CountedByAttr {{.*}} <{{.+}}ptrcheck.h:56:40, col:56> 0 // CHECK-NEXT:| | `-DeclRefExpr {{.*}} <{{.*}}attributes_in_template_decls_attr_only_mode.cpp:216:24> 'int' lvalue Var {{.*}} 'size_local' 'int' // CHECK-NEXT:| |-ClassTemplateSpecialization {{.*}} 'RefParamMustBePtrExternallyCountedGood' -// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:195:7 class RefParamMustBePtrExternallyCountedGood definition implicit_instantiation +// CHECK-NEXT:| |-ClassTemplateSpecializationDecl {{.*}} line:195:7 class RefParamMustBePtrExternallyCountedGood definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| | |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | | |-DefaultConstructor exists trivial // CHECK-NEXT:| | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -1027,7 +1027,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | | `-ParmVarDecl {{.*}} col:7 'const RefParamMustBePtrExternallyCountedGood &' // CHECK-NEXT:| | `-CXXConstructorDecl {{.*}} col:7 implicit constexpr RefParamMustBePtrExternallyCountedGood 'void (RefParamMustBePtrExternallyCountedGood &&)' inline default trivial noexcept-unevaluated {{.*}} // CHECK-NEXT:| | `-ParmVarDecl {{.*}} col:7 'RefParamMustBePtrExternallyCountedGood &&' -// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:195:7 class RefParamMustBePtrExternallyCountedGood definition implicit_instantiation +// CHECK-NEXT:| `-ClassTemplateSpecializationDecl {{.*}} line:195:7 class RefParamMustBePtrExternallyCountedGood definition instantiated_from {{.*}} implicit_instantiation // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param implicit_has_const_param @@ -1056,7 +1056,7 @@ void Instantiate_RefParamMustBePtrExternallyCountedGood() { // CHECK-NEXT:| | `-ParmVarDecl {{.*}} col:7 'const RefParamMustBePtrExternallyCountedGood &' // CHECK-NEXT:| `-CXXConstructorDecl {{.*}} col:7 implicit constexpr RefParamMustBePtrExternallyCountedGood 'void (RefParamMustBePtrExternallyCountedGood &&)' inline default trivial noexcept-unevaluated {{.*}} // CHECK-NEXT:| `-ParmVarDecl {{.*}} col:7 'RefParamMustBePtrExternallyCountedGood &&' -// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:16 class RefParamMustBePtrExternallyCountedGood definition explicit_instantiation_definition +// CHECK-NEXT:|-ClassTemplateSpecializationDecl {{.*}} col:16 class RefParamMustBePtrExternallyCountedGood definition instantiated_from {{.*}} explicit_instantiation_definition // CHECK-NEXT:| |-DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal // CHECK-NEXT:| | |-DefaultConstructor exists trivial needs_implicit // CHECK-NEXT:| | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param