diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-07-21 12:49:28 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-07-21 12:49:28 +0000 |
commit | 02689b0536857e85f48e9958baff00de321323e2 (patch) | |
tree | 5ed1faf56e16d372e2b4cd0b49cdd1b5e2f14a42 /test/Tooling | |
parent | 98d12e2907c609210372edb107203c16cd4c4848 (diff) | |
download | clang-02689b0536857e85f48e9958baff00de321323e2.tar.gz |
[clang-diff] Add initial implementation
This is the first commit for the "Clang-based C/C++ diff tool" GSoC project.
ASTDiff is a new library that computes a structural AST diff between two ASTs
using the gumtree algorithm. Clang-diff is a new Clang tool that will show
the structural code changes between different ASTs.
Patch by Johannes Altmanninger!
Differential Revision: https://reviews.llvm.org/D34329
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@308731 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Tooling')
-rw-r--r-- | test/Tooling/clang-diff-basic.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/test/Tooling/clang-diff-basic.cpp b/test/Tooling/clang-diff-basic.cpp new file mode 100644 index 0000000000..1f0a2a9357 --- /dev/null +++ b/test/Tooling/clang-diff-basic.cpp @@ -0,0 +1,78 @@ +// 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 |