| // RUN: %clang_cc1 -E %s > %T/src.cpp |
| // RUN: %clang_cc1 -E %s > %T/dst.cpp -DDEST |
| // RUN: clang-diff -no-compilation-database %T/src.cpp %T/dst.cpp | FileCheck %s |
| |
| #ifndef DEST |
| namespace src { |
| |
| void foo() { |
| int x = 321; |
| } |
| |
| void main() { foo(); }; |
| |
| const char *a = "foo"; |
| |
| typedef unsigned int nat; |
| |
| int p = 1 * 2 * 3 * 4; |
| int squared = p * p; |
| |
| class X { |
| const char *foo(int i) { |
| if (i == 0) |
| return "foo"; |
| return 0; |
| } |
| |
| public: |
| X(){}; |
| |
| int id(int i) { return i; } |
| }; |
| } |
| #else |
| // CHECK: Match TranslationUnitDecl{{.*}} to TranslationUnitDecl |
| // CHECK: Match NamespaceDecl: src{{.*}} to NamespaceDecl: dst |
| namespace dst { |
| // CHECK-NOT: Match NamespaceDecl: src{{.*}} to NamespaceDecl: inner |
| namespace inner { |
| void foo() { |
| // CHECK: Match IntegerLiteral: 321{{.*}} to IntegerLiteral: 322 |
| int x = 322; |
| } |
| } |
| |
| // CHECK: Match DeclRefExpr: foo{{.*}} to DeclRefExpr: inner::foo |
| void main() { inner::foo(); } |
| |
| // CHECK: Match StringLiteral: foo{{.*}} to StringLiteral: foo |
| const char *b = "f" "o" "o"; |
| |
| // unsigned is canonicalized to unsigned int |
| // CHECK: Match TypedefDecl: nat;unsigned int;{{.*}} to TypedefDecl: nat;unsigned int; |
| typedef unsigned nat; |
| |
| // CHECK: Match VarDecl: p(int){{.*}} to VarDecl: prod(double) |
| // CHECK: Match BinaryOperator: *{{.*}} to BinaryOperator: * |
| // CHECK: Update VarDecl: p(int){{.*}} to prod(double) |
| double prod = 1 * 2 * 10; |
| // CHECK: Update DeclRefExpr |
| int squared = prod * prod; |
| |
| class X { |
| const char *foo(int i) { |
| if (i == 0) |
| return "Bar"; |
| // CHECK: Insert IfStmt{{.*}} into IfStmt |
| // CHECK: Insert BinaryOperator: =={{.*}} into IfStmt |
| else if (i == -1) |
| return "foo"; |
| return 0; |
| } |
| // CHECK: Delete AccessSpecDecl: public |
| X(){}; |
| // CHECK: Delete CXXMethodDecl |
| }; |
| } |
| #endif |