[clang] [clang] fix structural comparison for dependent class member pointer (PR #133343)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 27 16:37:11 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Matheus Izvekov (mizvekov)
<details>
<summary>Changes</summary>
Fixes a regression introduced in https://github.com/llvm/llvm-project/pull/130537 and reported here https://github.com/llvm/llvm-project/issues/133144
This fixes a crash in ASTStructuralEquivalence where the non-null precondition for IsStructurallyEquivalent would be violated, when comparing member pointers with a dependent class.
This also drive-by fixes the ast node traverser for member pointers so it doesn't traverse into the qualifier in case it's not a type, or the class declaration in case there is none.
This avoids printing of `<<<NULL>>>` on the text node dumper, which is redundant.
No release notes since the regression was never released.
Fixes https://github.com/llvm/llvm-project/issues/133144
---
Patch is 28.94 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/133343.diff
5 Files Affected:
- (modified) clang/include/clang/AST/ASTNodeTraverser.h (+7-2)
- (modified) clang/lib/AST/ASTStructuralEquivalence.cpp (+5-3)
- (modified) clang/test/AST/ast-dump-template-json-win32-mangler-crash.cpp (-3)
- (modified) clang/test/AST/ast-dump-templates.cpp (+369-6)
- (modified) clang/test/AST/ast-dump-types-json.cpp (-304)
``````````diff
diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h
index f557555e96e59..83a6b77704f34 100644
--- a/clang/include/clang/AST/ASTNodeTraverser.h
+++ b/clang/include/clang/AST/ASTNodeTraverser.h
@@ -394,8 +394,13 @@ class ASTNodeTraverser
}
void VisitMemberPointerType(const MemberPointerType *T) {
// FIXME: Provide a NestedNameSpecifier visitor.
- Visit(T->getQualifier()->getAsType());
- Visit(T->getMostRecentCXXRecordDecl());
+ NestedNameSpecifier *Qualifier = T->getQualifier();
+ if (NestedNameSpecifier::SpecifierKind K = Qualifier->getKind();
+ K == NestedNameSpecifier::TypeSpec ||
+ K == NestedNameSpecifier::TypeSpecWithTemplate)
+ Visit(Qualifier->getAsType());
+ if (T->isSugared())
+ Visit(T->getMostRecentCXXRecordDecl()->getTypeForDecl());
Visit(T->getPointeeType());
}
void VisitArrayType(const ArrayType *T) { Visit(T->getElementType()); }
diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp
index 2c2c8fd677500..a4349bdaaf682 100644
--- a/clang/lib/AST/ASTStructuralEquivalence.cpp
+++ b/clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -897,9 +897,11 @@ static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context,
if (!IsStructurallyEquivalent(Context, MemPtr1->getQualifier(),
MemPtr2->getQualifier()))
return false;
- if (!IsStructurallyEquivalent(Context,
- MemPtr1->getMostRecentCXXRecordDecl(),
- MemPtr2->getMostRecentCXXRecordDecl()))
+ CXXRecordDecl *D1 = MemPtr1->getMostRecentCXXRecordDecl(),
+ *D2 = MemPtr2->getMostRecentCXXRecordDecl();
+ if (D1 == D2)
+ break;
+ if (!D1 || !D2 || !IsStructurallyEquivalent(Context, D1, D2))
return false;
break;
}
diff --git a/clang/test/AST/ast-dump-template-json-win32-mangler-crash.cpp b/clang/test/AST/ast-dump-template-json-win32-mangler-crash.cpp
index 9f0d3efb6277e..b80c1e1d77140 100644
--- a/clang/test/AST/ast-dump-template-json-win32-mangler-crash.cpp
+++ b/clang/test/AST/ast-dump-template-json-win32-mangler-crash.cpp
@@ -2452,9 +2452,6 @@ int main()
// CHECK-NEXT: }
// CHECK-NEXT: },
// CHECK-NEXT: {
-// CHECK-NEXT: "id": "0x0"
-// CHECK-NEXT: },
-// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
// CHECK-NEXT: "kind": "TemplateTypeParmType",
// CHECK-NEXT: "type": {
diff --git a/clang/test/AST/ast-dump-templates.cpp b/clang/test/AST/ast-dump-templates.cpp
index 0e0fa73871bb7..79572f5103bde 100644
--- a/clang/test/AST/ast-dump-templates.cpp
+++ b/clang/test/AST/ast-dump-templates.cpp
@@ -154,10 +154,30 @@ namespace TestMemberPointerPartialSpec {
// DUMP-NEXT: |-TemplateArgument type 'type-parameter-0-0 type-parameter-0-1::*'
// DUMP-NEXT: | `-MemberPointerType {{.+}} 'type-parameter-0-0 type-parameter-0-1::*' dependent
// DUMP-NEXT: | |-TemplateTypeParmType {{.+}} 'type-parameter-0-1' dependent depth 0 index 1
-// DUMP-NEXT: | |-<<<NULL>>>
// DUMP-NEXT: | `-TemplateTypeParmType {{.+}} 'type-parameter-0-0' dependent depth 0 index 0
} // namespace TestMemberPointerPartialSpec
+namespace TestDependentMemberPointer {
+ template <class U> struct A {
+ using X = int U::*;
+ using Y = int U::test::*;
+ using Z = int U::template V<int>::*;
+ };
+// DUMP-LABEL: NamespaceDecl {{.+}} TestDependentMemberPointer{{$}}
+// DUMP: |-TypeAliasDecl {{.+}} X 'int U::*'{{$}}
+// DUMP-NEXT: | `-MemberPointerType {{.+}} 'int U::*' dependent
+// DUMP-NEXT: | |-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 0
+// DUMP-NEXT: | | `-TemplateTypeParm {{.+}} 'U'
+// DUMP-NEXT: | `-BuiltinType {{.+}} 'int'
+// DUMP-NEXT: |-TypeAliasDecl {{.+}} Y 'int U::test::*'{{$}}
+// DUMP-NEXT: | `-MemberPointerType {{.+}} 'int U::test::*' dependent
+// DUMP-NEXT: | `-BuiltinType {{.+}} 'int'
+// DUMP-NEXT: `-TypeAliasDecl {{.+}} Z 'int U::template V<int>::*'{{$}}
+// DUMP-NEXT: `-MemberPointerType {{.+}} 'int U::template V<int>::*' dependent
+// DUMP-NEXT: |-DependentTemplateSpecializationType {{.+}} 'U::template V<int>' dependent
+// DUMP-NEXT: `-BuiltinType {{.+}} 'int'
+} // namespoace TestDependentMemberPointer
+
// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
@@ -6345,8 +6365,8 @@ namespace TestMemberPointerPartialSpec {
// JSON-NEXT: "tokLen": 9
// JSON-NEXT: },
// JSON-NEXT: "end": {
-// JSON-NEXT: "offset": 5335,
-// JSON-NEXT: "line": 159,
+// JSON-NEXT: "offset": 5303,
+// JSON-NEXT: "line": 158,
// JSON-NEXT: "col": 1,
// JSON-NEXT: "tokLen": 1
// JSON-NEXT: }
@@ -6480,9 +6500,6 @@ namespace TestMemberPointerPartialSpec {
// JSON-NEXT: }
// JSON-NEXT: },
// JSON-NEXT: {
-// JSON-NEXT: "id": "0x0"
-// JSON-NEXT: },
-// JSON-NEXT: {
// JSON-NEXT: "id": "0x{{.*}}",
// JSON-NEXT: "kind": "TemplateTypeParmType",
// JSON-NEXT: "type": {
@@ -6554,6 +6571,352 @@ namespace TestMemberPointerPartialSpec {
// JSON-NEXT: ]
// JSON-NEXT: }
// JSON-NEXT: ]
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "NamespaceDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5358,
+// JSON-NEXT: "line": 160,
+// JSON-NEXT: "col": 11,
+// JSON-NEXT: "tokLen": 26
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5348,
+// JSON-NEXT: "col": 1,
+// JSON-NEXT: "tokLen": 9
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 6359,
+// JSON-NEXT: "line": 179,
+// JSON-NEXT: "col": 1,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "TestDependentMemberPointer",
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "ClassTemplateDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5415,
+// JSON-NEXT: "line": 161,
+// JSON-NEXT: "col": 29,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5389,
+// JSON-NEXT: "col": 3,
+// JSON-NEXT: "tokLen": 8
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5516,
+// JSON-NEXT: "line": 165,
+// JSON-NEXT: "col": 3,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "A",
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "TemplateTypeParmDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5405,
+// JSON-NEXT: "line": 161,
+// JSON-NEXT: "col": 19,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5399,
+// JSON-NEXT: "col": 13,
+// JSON-NEXT: "tokLen": 5
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5405,
+// JSON-NEXT: "col": 19,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "U",
+// JSON-NEXT: "tagUsed": "class",
+// JSON-NEXT: "depth": 0,
+// JSON-NEXT: "index": 0
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "CXXRecordDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5415,
+// JSON-NEXT: "col": 29,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5408,
+// JSON-NEXT: "col": 22,
+// JSON-NEXT: "tokLen": 6
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5516,
+// JSON-NEXT: "line": 165,
+// JSON-NEXT: "col": 3,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "A",
+// JSON-NEXT: "tagUsed": "struct",
+// JSON-NEXT: "completeDefinition": true,
+// JSON-NEXT: "definitionData": {
+// JSON-NEXT: "canConstDefaultInit": true,
+// JSON-NEXT: "copyAssign": {
+// JSON-NEXT: "hasConstParam": true,
+// JSON-NEXT: "implicitHasConstParam": true,
+// JSON-NEXT: "needsImplicit": true,
+// JSON-NEXT: "simple": true,
+// JSON-NEXT: "trivial": true
+// JSON-NEXT: },
+// JSON-NEXT: "copyCtor": {
+// JSON-NEXT: "hasConstParam": true,
+// JSON-NEXT: "implicitHasConstParam": true,
+// JSON-NEXT: "needsImplicit": true,
+// JSON-NEXT: "simple": true,
+// JSON-NEXT: "trivial": true
+// JSON-NEXT: },
+// JSON-NEXT: "defaultCtor": {
+// JSON-NEXT: "defaultedIsConstexpr": true,
+// JSON-NEXT: "exists": true,
+// JSON-NEXT: "isConstexpr": true,
+// JSON-NEXT: "needsImplicit": true,
+// JSON-NEXT: "trivial": true
+// JSON-NEXT: },
+// JSON-NEXT: "dtor": {
+// JSON-NEXT: "irrelevant": true,
+// JSON-NEXT: "needsImplicit": true,
+// JSON-NEXT: "simple": true,
+// JSON-NEXT: "trivial": true
+// JSON-NEXT: },
+// JSON-NEXT: "hasConstexprNonCopyMoveConstructor": true,
+// JSON-NEXT: "isAggregate": true,
+// JSON-NEXT: "isEmpty": true,
+// JSON-NEXT: "isLiteral": true,
+// JSON-NEXT: "isPOD": true,
+// JSON-NEXT: "isStandardLayout": true,
+// JSON-NEXT: "isTrivial": true,
+// JSON-NEXT: "isTriviallyCopyable": true,
+// JSON-NEXT: "moveAssign": {
+// JSON-NEXT: "exists": true,
+// JSON-NEXT: "needsImplicit": true,
+// JSON-NEXT: "simple": true,
+// JSON-NEXT: "trivial": true
+// JSON-NEXT: },
+// JSON-NEXT: "moveCtor": {
+// JSON-NEXT: "exists": true,
+// JSON-NEXT: "needsImplicit": true,
+// JSON-NEXT: "simple": true,
+// JSON-NEXT: "trivial": true
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "CXXRecordDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5415,
+// JSON-NEXT: "line": 161,
+// JSON-NEXT: "col": 29,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5408,
+// JSON-NEXT: "col": 22,
+// JSON-NEXT: "tokLen": 6
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5415,
+// JSON-NEXT: "col": 29,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "isImplicit": true,
+// JSON-NEXT: "name": "A",
+// JSON-NEXT: "tagUsed": "struct"
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "TypeAliasDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5429,
+// JSON-NEXT: "line": 162,
+// JSON-NEXT: "col": 11,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5423,
+// JSON-NEXT: "col": 5,
+// JSON-NEXT: "tokLen": 5
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5440,
+// JSON-NEXT: "col": 22,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "X",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int U::*"
+// JSON-NEXT: },
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "MemberPointerType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int U::*"
+// JSON-NEXT: },
+// JSON-NEXT: "isDependent": true,
+// JSON-NEXT: "isInstantiationDependent": true,
+// JSON-NEXT: "isData": true,
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "TemplateTypeParmType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "U"
+// JSON-NEXT: },
+// JSON-NEXT: "isDependent": true,
+// JSON-NEXT: "isInstantiationDependent": true,
+// JSON-NEXT: "depth": 0,
+// JSON-NEXT: "index": 0,
+// JSON-NEXT: "decl": {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "TemplateTypeParmDecl",
+// JSON-NEXT: "name": "U"
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "BuiltinType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int"
+// JSON-NEXT: }
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "TypeAliasDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5453,
+// JSON-NEXT: "line": 163,
+// JSON-NEXT: "col": 11,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5447,
+// JSON-NEXT: "col": 5,
+// JSON-NEXT: "tokLen": 5
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5470,
+// JSON-NEXT: "col": 28,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "Y",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int U::test::*"
+// JSON-NEXT: },
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "MemberPointerType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int U::test::*"
+// JSON-NEXT: },
+// JSON-NEXT: "isDependent": true,
+// JSON-NEXT: "isInstantiationDependent": true,
+// JSON-NEXT: "isData": true,
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "BuiltinType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int"
+// JSON-NEXT: }
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "TypeAliasDecl",
+// JSON-NEXT: "loc": {
+// JSON-NEXT: "offset": 5483,
+// JSON-NEXT: "line": 164,
+// JSON-NEXT: "col": 11,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: },
+// JSON-NEXT: "range": {
+// JSON-NEXT: "begin": {
+// JSON-NEXT: "offset": 5477,
+// JSON-NEXT: "col": 5,
+// JSON-NEXT: "tokLen": 5
+// JSON-NEXT: },
+// JSON-NEXT: "end": {
+// JSON-NEXT: "offset": 5511,
+// JSON-NEXT: "col": 39,
+// JSON-NEXT: "tokLen": 1
+// JSON-NEXT: }
+// JSON-NEXT: },
+// JSON-NEXT: "name": "Z",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int U::template V<int>::*"
+// JSON-NEXT: },
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "MemberPointerType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int U::template V<int>::*"
+// JSON-NEXT: },
+// JSON-NEXT: "isDependent": true,
+// JSON-NEXT: "isInstantiationDependent": true,
+// JSON-NEXT: "isData": true,
+// JSON-NEXT: "inner": [
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "DependentTemplateSpecializationType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "U::template V<int>"
+// JSON-NEXT: },
+// JSON-NEXT: "isDependent": true,
+// JSON-NEXT: "isInstantiationDependent": true
+// JSON-NEXT: },
+// JSON-NEXT: {
+// JSON-NEXT: "id": "0x{{.*}}",
+// JSON-NEXT: "kind": "BuiltinType",
+// JSON-NEXT: "type": {
+// JSON-NEXT: "qualType": "int"
+// JSON-NEXT: }
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: }
+// JSON-NEXT: ]
+// JSON-NEXT: }
+// JSON-NEXT: ]
// JSON-NEXT: }
// JSON-NEXT: ]
// JSON-NEXT: }
diff --git a/clang/test/AST/ast-dump-types-json.cpp b/clang/test/AST/ast-dump-types-json.cpp
index 67379ac318e05..cc4d4d9a64872 100644
--- a/clang/test/AST/ast-dump-types-json.cpp
+++ b/clang/test/AST/ast-dump-types-json.cpp
@@ -264,158 +264,6 @@ using ::TestUsingShadowDeclType;
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
-// CHECK-NEXT: "kind": "CXXRecordDecl",
-// CHECK-NEXT: "loc": {
-// CHECK-NEXT: "offset": 158,
-// CHECK-NEXT: "line": 7,
-// CHECK-NEXT: "col": 8,
-// CHECK-NEXT: "tokLen": 1
-// CHECK-NEXT: },
-// CHECK-NEXT: "range": {
-// CHECK-NEXT: "begin": {
-// CHECK-NEXT: "offset": 151,
-// CHECK-NEXT: "col": 1,
-// CHECK-NEXT: "tokLen": 6
-// CHECK-NEXT: },
-// CHECK-NEXT: "end": {
-// CHECK-NEXT: "offset": 183,
-// CHECK-NEXT: "line": 10,
-// CHECK-NEXT: "col": 1,
-// CHECK-NEXT: "tokLen": 1
-// CHECK-NEXT: }
-// CHECK-NEXT: },
-// CHECK-NEXT: "name": "T",
-// CHECK-NEXT: "tagUsed": "struct",
-// CHECK-NEXT: "completeDefinition": true,
-// CHECK-NEXT: "definitionData": {
-// CHECK-NEXT: "canPassInRegisters": true,
-// CHECK-NEXT: "copyAssign": {
-// CHECK-NEXT: "hasConstParam": true,
-// CHECK-NEXT: "implicitHasConstParam": true,
-// CHECK-NEXT: "needsImplicit": true,
-// CHECK-NEXT: "simple": true,
-// CHECK-NEXT: "trivial": true
-// CHECK-NEXT: },
-// CHECK-NEXT: "copyCtor": {
-// CHECK-NEXT: "hasConstParam": true,
-// CHECK-NEXT: "implicitHasConstParam": true,
-// CHECK-NEXT: "needsImplicit": true,
-// CHECK-NEXT: "simple": true,
-// CHECK-NEXT: "trivial": true
-// CHECK-NEXT: },
-// CHECK-NEXT: "defaultCtor": {
-// CHECK-NEXT: "exists": true,
-// CHECK-NEXT: "needsImplicit": true,
-// CHECK-NEXT: "trivial": true
-// CHECK-NEXT: },
-// CHECK-NEXT: "dtor": {
-// CHECK-NEXT: "irrelevant": true,
-// CHECK-NEXT: "needsImplicit": true,
-// CHECK-NEXT: "simple": true,
-// CHECK-NEXT: "trivial": true
-// CHECK-NEXT: },
-// CHECK-NEXT: "isAggregate": true,
-// CHECK-NEXT: "isLiteral": true,
-// CHECK-NEXT: "isPOD": true,
-// CHECK-NEXT: "isStandardLayout": true,
-// CHE...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/133343
More information about the cfe-commits
mailing list