172 lines · cpp
1// RUN: %clang_cc1 -ast-dump=json %s | FileCheck -strict-whitespace %s2 3struct ExplicitBase {4 explicit ExplicitBase(const char *) { }5 ExplicitBase(const ExplicitBase &) {}6 ExplicitBase(ExplicitBase &&) {}7 ExplicitBase &operator=(const ExplicitBase &) { return *this; }8 ExplicitBase &operator=(ExplicitBase &&) { return *this; }9 ~ExplicitBase() { }10};11 12struct Derived1 : ExplicitBase {};13 14Derived1 makeDerived1() {15// CHECK: "kind": "FunctionDecl",16// CHECK: "name": "makeDerived1",17 18// CHECK: "kind": "CompoundStmt",19 20// CHECK: "kind": "ReturnStmt",21// CHECK: "kind": "ExprWithCleanups",22// CHECK: "type": {23// CHECK-NEXT: "qualType": "Derived1"24// CHECK-NEXT: },25 26// CHECK: "kind": "CXXFunctionalCastExpr",27// CHECK: "type": {28// CHECK-NEXT: "qualType": "Derived1"29// CHECK-NEXT: },30// CHECK-NEXT: "valueCategory": "prvalue",31// CHECK-NEXT: "castKind": "NoOp",32 33// CHECK: "kind": "CXXBindTemporaryExpr",34// CHECK: "type": {35// CHECK-NEXT: "qualType": "Derived1"36// CHECK-NEXT: },37// CHECK-NEXT: "valueCategory": "prvalue",38 39// CHECK: "kind": "InitListExpr",40// CHECK: "type": {41// CHECK-NEXT: "qualType": "Derived1"42// CHECK-NEXT: },43// CHECK-NEXT: "valueCategory": "prvalue",44 45// CHECK: "kind": "CXXConstructExpr",46// CHECK: "type": {47// CHECK-NEXT: "qualType": "ExplicitBase"48// CHECK-NEXT: },49// CHECK-NEXT: "valueCategory": "prvalue",50// CHECK-NEXT: "ctorType": {51// CHECK-NEXT: "qualType": "void (ExplicitBase &&)"52// CHECK-NEXT: },53// CHECK-NEXT: "hadMultipleCandidates": true,54// CHECK-NEXT: "constructionKind": "non-virtual base",55 56// CHECK: "kind": "MaterializeTemporaryExpr",57// CHECK: "type": {58// CHECK-NEXT: "qualType": "ExplicitBase"59// CHECK-NEXT: },60// CHECK-NEXT: "valueCategory": "xvalue",61// CHECK-NEXT: "storageDuration": "full expression",62 63// CHECK: "kind": "CXXBindTemporaryExpr",64// CHECK: "type": {65// CHECK-NEXT: "qualType": "ExplicitBase"66// CHECK-NEXT: },67// CHECK-NEXT: "valueCategory": "prvalue",68 69// CHECK: "kind": "CXXTemporaryObjectExpr",70// CHECK: "type": {71// CHECK-NEXT: "qualType": "ExplicitBase"72// CHECK-NEXT: },73// CHECK-NEXT: "valueCategory": "prvalue",74// CHECK-NEXT: "ctorType": {75// CHECK-NEXT: "qualType": "void (const char *)"76// CHECK-NEXT: },77// CHECK-NEXT: "list": true,78// CHECK-NEXT: "hadMultipleCandidates": true,79// CHECK-NEXT: "constructionKind": "complete",80 81// CHECK: "kind": "ImplicitCastExpr",82// CHECK: "type": {83// CHECK-NEXT: "qualType": "const char *"84// CHECK-NEXT: },85// CHECK-NEXT: "valueCategory": "prvalue",86// CHECK-NEXT: "castKind": "ArrayToPointerDecay",87 88// CHECK: "kind": "StringLiteral",89// CHECK: "type": {90// CHECK-NEXT: "qualType": "const char[10]"91// CHECK-NEXT: },92// CHECK-NEXT: "valueCategory": "lvalue",93// CHECK-NEXT: "value": "\"Move Ctor\""94 return Derived1{ExplicitBase{"Move Ctor"}};95}96 97struct ImplicitBase {98 ImplicitBase(const char *) { }99 ImplicitBase(const ImplicitBase &) {}100 ImplicitBase(ImplicitBase &&) {}101 ImplicitBase &operator=(const ImplicitBase &) { return *this; }102 ImplicitBase &operator=(ImplicitBase &&) { return *this; }103 ~ImplicitBase() { }104};105 106struct Derived2 : ImplicitBase {};107 108Derived2 makeDerived2() {109// CHECK: "kind": "FunctionDecl",110// CHECK: "name": "makeDerived2",111 112// CHECK: "kind": "CompoundStmt",113 114// CHECK: "kind": "ReturnStmt",115 116// CHECK: "kind": "ExprWithCleanups",117// CHECK: "type": {118// CHECK-NEXT: "qualType": "Derived2"119// CHECK-NEXT: },120// CHECK-NEXT: "valueCategory": "prvalue",121// CHECK-NEXT: "cleanupsHaveSideEffects": true,122 123// CHECK: "kind": "CXXFunctionalCastExpr",124// CHECK: "type": {125// CHECK-NEXT: "qualType": "Derived2"126// CHECK-NEXT: },127// CHECK-NEXT: "valueCategory": "prvalue",128// CHECK-NEXT: "castKind": "NoOp",129 130// CHECK: "kind": "CXXBindTemporaryExpr",131// CHECK: "type": {132// CHECK-NEXT: "qualType": "Derived2"133// CHECK-NEXT: },134// CHECK-NEXT: "valueCategory": "prvalue",135 136// CHECK: "kind": "InitListExpr",137// CHECK: "type": {138// CHECK-NEXT: "qualType": "Derived2"139// CHECK-NEXT: },140// CHECK-NEXT: "valueCategory": "prvalue",141 142// CHECK: "kind": "CXXConstructExpr",143// CHECK: "type": {144// CHECK-NEXT: "qualType": "ImplicitBase"145// CHECK-NEXT: },146// CHECK-NEXT: "valueCategory": "prvalue",147// CHECK-NEXT: "ctorType": {148// CHECK-NEXT: "qualType": "void (const char *)"149// CHECK-NEXT: },150// CHECK-NEXT: "list": true,151// CHECK-NEXT: "hadMultipleCandidates": true,152// CHECK-NEXT: "constructionKind": "non-virtual base",153 154// CHECK: "kind": "ImplicitCastExpr",155// CHECK: "type": {156// CHECK-NEXT: "qualType": "const char *"157// CHECK-NEXT: },158// CHECK-NEXT: "valueCategory": "prvalue",159// CHECK-NEXT: "castKind": "ArrayToPointerDecay",160 161// CHECK: "kind": "StringLiteral",162// CHECK: "type": {163// CHECK-NEXT: "qualType": "const char[8]"164// CHECK-NEXT: },165// CHECK-NEXT: "valueCategory": "lvalue",166// CHECK-NEXT: "value": "\"No Ctor\""167 return Derived2{{"No Ctor"}};168}169 170// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py171// using --filters=FunctionDecl,CompoundStmt,ReturnStmt,MaterializeTemporaryExpr,CXXBindTemporaryExpr,CXXTemporaryObjectExpr,ImplicitCastExpr,StringLiteralStringLiteral172