Skip to content

Commit

Permalink
[clang] [ASTDump] Add support for structural value template arguments…
Browse files Browse the repository at this point in the history
… in TextNodeDumper (#126341)

It was missed in 5518a9d which introduced this new template argument kind.
  • Loading branch information
sakria9 authored Feb 13, 2025
1 parent e76739e commit 7050e7d
Show file tree
Hide file tree
Showing 6 changed files with 177 additions and 5 deletions.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ ABI Changes in This Version
AST Dumping Potentially Breaking Changes
----------------------------------------

- Added support for dumping template arguments of structural value kinds.

Clang Frontend Potentially Breaking Changes
-------------------------------------------

Expand Down
1 change: 1 addition & 0 deletions clang/include/clang/AST/JSONNodeDumper.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ class JSONNodeDumper
void VisitDeclarationTemplateArgument(const TemplateArgument &TA);
void VisitNullPtrTemplateArgument(const TemplateArgument &TA);
void VisitIntegralTemplateArgument(const TemplateArgument &TA);
void VisitStructuralValueTemplateArgument(const TemplateArgument &TA);
void VisitTemplateTemplateArgument(const TemplateArgument &TA);
void VisitTemplateExpansionTemplateArgument(const TemplateArgument &TA);
void VisitExpressionTemplateArgument(const TemplateArgument &TA);
Expand Down
1 change: 1 addition & 0 deletions clang/include/clang/AST/TextNodeDumper.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ class TextNodeDumper
void VisitDeclarationTemplateArgument(const TemplateArgument &TA);
void VisitNullPtrTemplateArgument(const TemplateArgument &TA);
void VisitIntegralTemplateArgument(const TemplateArgument &TA);
void VisitStructuralValueTemplateArgument(const TemplateArgument &TA);
void VisitTemplateTemplateArgument(const TemplateArgument &TA);
void VisitTemplateExpansionTemplateArgument(const TemplateArgument &TA);
void VisitExpressionTemplateArgument(const TemplateArgument &TA);
Expand Down
4 changes: 4 additions & 0 deletions clang/lib/AST/JSONNodeDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1705,6 +1705,10 @@ void JSONNodeDumper::VisitNullPtrTemplateArgument(const TemplateArgument &TA) {
void JSONNodeDumper::VisitIntegralTemplateArgument(const TemplateArgument &TA) {
JOS.attribute("value", TA.getAsIntegral().getSExtValue());
}
void JSONNodeDumper::VisitStructuralValueTemplateArgument(
const TemplateArgument &TA) {
Visit(TA.getAsStructuralValue(), TA.getStructuralValueType());
}
void JSONNodeDumper::VisitTemplateTemplateArgument(const TemplateArgument &TA) {
// FIXME: cannot just call dump() on the argument, as that doesn't specify
// the output format.
Expand Down
6 changes: 6 additions & 0 deletions clang/lib/AST/TextNodeDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,12 @@ void TextNodeDumper::VisitIntegralTemplateArgument(const TemplateArgument &TA) {
dumpTemplateArgument(TA);
}

void TextNodeDumper::VisitStructuralValueTemplateArgument(
const TemplateArgument &TA) {
OS << " structural value";
dumpTemplateArgument(TA);
}

void TextNodeDumper::dumpTemplateName(TemplateName TN, StringRef Label) {
AddChild(Label, [=] {
{
Expand Down
168 changes: 163 additions & 5 deletions clang/test/AST/ast-dump-templates.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump=json %s | FileCheck --check-prefix=JSON %s
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-print %s > %t
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++20 -ast-dump=json %s | FileCheck --check-prefix=JSON %s
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++20 -ast-print %s > %t
// RUN: FileCheck < %t %s -check-prefix=CHECK1
// RUN: FileCheck < %t %s -check-prefix=CHECK2
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s | FileCheck --check-prefix=DUMP %s
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++20 -ast-dump %s | FileCheck --check-prefix=DUMP %s

// Test with serialization:
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -emit-pch -o %t %s
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -x c++ -std=c++17 -include-pch %t \
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++20 -emit-pch -o %t %s
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -x c++ -std=c++20 -include-pch %t \
// RUN: -ast-dump-all /dev/null \
// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
// RUN: | FileCheck --strict-whitespace --check-prefix=DUMP %s
Expand Down Expand Up @@ -135,6 +135,17 @@ namespace test7 {
// DUMP: ClassTemplateSpecializationDecl {{.*}} struct A definition explicit_instantiation_definition strict-pack-match{{$}}
} // namespce test7

namespace test8 {
template<_Complex int x>
struct pr126341;
template<>
struct pr126341<{1, 2}>;
// DUMP-LABEL: NamespaceDecl {{.*}} test8{{$}}
// DUMP-NEXT: |-ClassTemplateDecl {{.*}} pr126341
// DUMP: `-ClassTemplateSpecializationDecl {{.*}} pr126341
// DUMP: `-TemplateArgument structural value '1+2i'
} // namespace test8

// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py


Expand Down Expand Up @@ -486,6 +497,7 @@ namespace test7 {
// JSON-NEXT: "trivial": true
// JSON-NEXT: },
// JSON-NEXT: "defaultCtor": {
// JSON-NEXT: "defaultedIsConstexpr": true,
// JSON-NEXT: "exists": true,
// JSON-NEXT: "nonTrivial": true,
// JSON-NEXT: "userProvided": true
Expand Down Expand Up @@ -819,6 +831,7 @@ namespace test7 {
// JSON-NEXT: "trivial": true
// JSON-NEXT: },
// JSON-NEXT: "defaultCtor": {
// JSON-NEXT: "defaultedIsConstexpr": true,
// JSON-NEXT: "exists": true,
// JSON-NEXT: "nonTrivial": true,
// JSON-NEXT: "userProvided": true
Expand Down Expand Up @@ -1408,6 +1421,7 @@ namespace test7 {
// JSON-NEXT: "qualType": "void () noexcept"
// JSON-NEXT: },
// JSON-NEXT: "inline": true,
// JSON-NEXT: "constexpr": true,
// JSON-NEXT: "explicitlyDefaulted": "default"
// JSON-NEXT: }
// JSON-NEXT: ]
Expand Down Expand Up @@ -1454,6 +1468,7 @@ namespace test7 {
// JSON-NEXT: "trivial": true
// JSON-NEXT: },
// JSON-NEXT: "defaultCtor": {
// JSON-NEXT: "defaultedIsConstexpr": true,
// JSON-NEXT: "exists": true,
// JSON-NEXT: "nonTrivial": true,
// JSON-NEXT: "userProvided": true
Expand Down Expand Up @@ -2067,6 +2082,7 @@ namespace test7 {
// JSON-NEXT: "qualType": "void () noexcept"
// JSON-NEXT: },
// JSON-NEXT: "inline": true,
// JSON-NEXT: "constexpr": true,
// JSON-NEXT: "explicitlyDefaulted": "default"
// JSON-NEXT: }
// JSON-NEXT: ]
Expand Down Expand Up @@ -6158,6 +6174,148 @@ namespace test7 {
// JSON-NEXT: ]
// JSON-NEXT: }
// JSON-NEXT: ]
// JSON-NEXT: },
// JSON-NEXT: {
// JSON-NEXT: "id": "0x{{.*}}",
// JSON-NEXT: "kind": "NamespaceDecl",
// JSON-NEXT: "loc": {
// JSON-NEXT: "offset": 4339,
// JSON-NEXT: "line": 138,
// JSON-NEXT: "col": 11,
// JSON-NEXT: "tokLen": 5
// JSON-NEXT: },
// JSON-NEXT: "range": {
// JSON-NEXT: "begin": {
// JSON-NEXT: "offset": 4329,
// JSON-NEXT: "col": 1,
// JSON-NEXT: "tokLen": 9
// JSON-NEXT: },
// JSON-NEXT: "end": {
// JSON-NEXT: "offset": 4648,
// JSON-NEXT: "line": 147,
// JSON-NEXT: "col": 1,
// JSON-NEXT: "tokLen": 1
// JSON-NEXT: }
// JSON-NEXT: },
// JSON-NEXT: "name": "test8",
// JSON-NEXT: "inner": [
// JSON-NEXT: {
// JSON-NEXT: "id": "0x{{.*}}",
// JSON-NEXT: "kind": "ClassTemplateDecl",
// JSON-NEXT: "loc": {
// JSON-NEXT: "offset": 4379,
// JSON-NEXT: "line": 140,
// JSON-NEXT: "col": 8,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: },
// JSON-NEXT: "range": {
// JSON-NEXT: "begin": {
// JSON-NEXT: "offset": 4347,
// JSON-NEXT: "line": 139,
// JSON-NEXT: "col": 1,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: },
// JSON-NEXT: "end": {
// JSON-NEXT: "offset": 4379,
// JSON-NEXT: "line": 140,
// JSON-NEXT: "col": 8,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: }
// JSON-NEXT: },
// JSON-NEXT: "name": "pr126341",
// JSON-NEXT: "inner": [
// JSON-NEXT: {
// JSON-NEXT: "id": "0x{{.*}}",
// JSON-NEXT: "kind": "NonTypeTemplateParmDecl",
// JSON-NEXT: "loc": {
// JSON-NEXT: "offset": 4369,
// JSON-NEXT: "line": 139,
// JSON-NEXT: "col": 23,
// JSON-NEXT: "tokLen": 1
// JSON-NEXT: },
// JSON-NEXT: "range": {
// JSON-NEXT: "begin": {
// JSON-NEXT: "offset": 4356,
// JSON-NEXT: "col": 10,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: },
// JSON-NEXT: "end": {
// JSON-NEXT: "offset": 4369,
// JSON-NEXT: "col": 23,
// JSON-NEXT: "tokLen": 1
// JSON-NEXT: }
// JSON-NEXT: },
// JSON-NEXT: "name": "x",
// JSON-NEXT: "type": {
// JSON-NEXT: "qualType": "_Complex int"
// JSON-NEXT: },
// 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": 4379,
// JSON-NEXT: "line": 140,
// JSON-NEXT: "col": 8,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: },
// JSON-NEXT: "range": {
// JSON-NEXT: "begin": {
// JSON-NEXT: "offset": 4372,
// JSON-NEXT: "col": 1,
// JSON-NEXT: "tokLen": 6
// JSON-NEXT: },
// JSON-NEXT: "end": {
// JSON-NEXT: "offset": 4379,
// JSON-NEXT: "col": 8,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: }
// JSON-NEXT: },
// JSON-NEXT: "name": "pr126341",
// JSON-NEXT: "tagUsed": "struct"
// JSON-NEXT: },
// JSON-NEXT: {
// JSON-NEXT: "id": "0x{{.*}}",
// JSON-NEXT: "kind": "ClassTemplateSpecializationDecl",
// JSON-NEXT: "name": "pr126341"
// JSON-NEXT: }
// JSON-NEXT: ]
// JSON-NEXT: },
// JSON-NEXT: {
// JSON-NEXT: "id": "0x{{.*}}",
// JSON-NEXT: "kind": "ClassTemplateSpecializationDecl",
// JSON-NEXT: "loc": {
// JSON-NEXT: "offset": 4407,
// JSON-NEXT: "line": 142,
// JSON-NEXT: "col": 8,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: },
// JSON-NEXT: "range": {
// JSON-NEXT: "begin": {
// JSON-NEXT: "offset": 4389,
// JSON-NEXT: "line": 141,
// JSON-NEXT: "col": 1,
// JSON-NEXT: "tokLen": 8
// JSON-NEXT: },
// JSON-NEXT: "end": {
// JSON-NEXT: "offset": 4422,
// JSON-NEXT: "line": 142,
// JSON-NEXT: "col": 23,
// JSON-NEXT: "tokLen": 1
// JSON-NEXT: }
// JSON-NEXT: },
// JSON-NEXT: "name": "pr126341",
// JSON-NEXT: "tagUsed": "struct",
// JSON-NEXT: "inner": [
// JSON-NEXT: {
// JSON-NEXT: "kind": "TemplateArgument",
// JSON-NEXT: "value": "1+2i"
// JSON-NEXT: }
// JSON-NEXT: ]
// JSON-NEXT: }
// JSON-NEXT: ]
// JSON-NEXT: }
// JSON-NEXT: ]
// JSON-NEXT: }

0 comments on commit 7050e7d

Please sign in to comment.