Dump more information about construct expressions (resolved and unresolved) when dumping the AST to JSON.

llvm-svn: 363926
This commit is contained in:
Aaron Ballman
2019-06-20 13:19:41 +00:00
parent 72186a2494
commit d91b1edf7b
4 changed files with 590 additions and 384 deletions

View File

@@ -253,6 +253,8 @@ public:
void VisitConstantExpr(const ConstantExpr *CE);
void VisitInitListExpr(const InitListExpr *ILE);
void VisitGenericSelectionExpr(const GenericSelectionExpr *GSE);
void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *UCE);
void VisitCXXConstructExpr(const CXXConstructExpr *CE);
void VisitIntegerLiteral(const IntegerLiteral *IL);
void VisitCharacterLiteral(const CharacterLiteral *CL);

View File

@@ -994,6 +994,38 @@ void JSONNodeDumper::VisitGenericSelectionExpr(
attributeOnlyIfTrue("resultDependent", GSE->isResultDependent());
}
void JSONNodeDumper::VisitCXXUnresolvedConstructExpr(
const CXXUnresolvedConstructExpr *UCE) {
if (UCE->getType() != UCE->getTypeAsWritten())
JOS.attribute("typeAsWritten", createQualType(UCE->getTypeAsWritten()));
attributeOnlyIfTrue("list", UCE->isListInitialization());
}
void JSONNodeDumper::VisitCXXConstructExpr(const CXXConstructExpr *CE) {
CXXConstructorDecl *Ctor = CE->getConstructor();
JOS.attribute("ctorType", createQualType(Ctor->getType()));
attributeOnlyIfTrue("elidable", CE->isElidable());
attributeOnlyIfTrue("list", CE->isListInitialization());
attributeOnlyIfTrue("initializer_list", CE->isStdInitListInitialization());
attributeOnlyIfTrue("zeroing", CE->requiresZeroInitialization());
attributeOnlyIfTrue("hadMultipleCandidates", CE->hadMultipleCandidates());
switch (CE->getConstructionKind()) {
case CXXConstructExpr::CK_Complete:
JOS.attribute("constructionKind", "complete");
break;
case CXXConstructExpr::CK_Delegating:
JOS.attribute("constructionKind", "delegating");
break;
case CXXConstructExpr::CK_NonVirtualBase:
JOS.attribute("constructionKind", "non-virtual base");
break;
case CXXConstructExpr::CK_VirtualBase:
JOS.attribute("constructionKind", "virtual base");
break;
}
}
void JSONNodeDumper::VisitIntegerLiteral(const IntegerLiteral *IL) {
JOS.attribute("value",
IL->getValue().toString(

View File

@@ -7738,7 +7738,12 @@ void TestNonADLCall3() {
// CHECK-NEXT: "desugaredQualType": "NS::X",
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue"
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void () noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
@@ -7835,6 +7840,11 @@ void TestNonADLCall3() {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void (const NS::X &) noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete",
// CHECK-NEXT: "inner": [
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
@@ -7986,6 +7996,11 @@ void TestNonADLCall3() {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void (const NS::X &) noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete",
// CHECK-NEXT: "inner": [
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
@@ -8153,7 +8168,12 @@ void TestNonADLCall3() {
// CHECK-NEXT: "desugaredQualType": "NS::X",
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue"
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void () noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
@@ -8249,6 +8269,11 @@ void TestNonADLCall3() {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void (const NS::X &) noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete",
// CHECK-NEXT: "inner": [
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
@@ -8416,7 +8441,12 @@ void TestNonADLCall3() {
// CHECK-NEXT: "desugaredQualType": "NS::X",
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue"
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void () noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
@@ -8557,6 +8587,11 @@ void TestNonADLCall3() {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void (const NS::X &) noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete",
// CHECK-NEXT: "inner": [
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
@@ -8708,6 +8743,11 @@ void TestNonADLCall3() {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void (const NS::X &) noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete",
// CHECK-NEXT: "inner": [
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",
@@ -8873,7 +8913,12 @@ void TestNonADLCall3() {
// CHECK-NEXT: "type": {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue"
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void () noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
@@ -8969,6 +9014,11 @@ void TestNonADLCall3() {
// CHECK-NEXT: "qualType": "NS::X"
// CHECK-NEXT: },
// CHECK-NEXT: "valueCategory": "rvalue",
// CHECK-NEXT: "ctorType": {
// CHECK-NEXT: "qualType": "void (const NS::X &) noexcept"
// CHECK-NEXT: },
// CHECK-NEXT: "hadMultipleCandidates": true,
// CHECK-NEXT: "constructionKind": "complete",
// CHECK-NEXT: "inner": [
// CHECK-NEXT: {
// CHECK-NEXT: "id": "0x{{.*}}",

File diff suppressed because it is too large Load Diff