diff options
| author | Rafael Stahl <r.stahl@tum.de> | 2019-04-23 11:04:41 +0000 |
|---|---|---|
| committer | Rafael Stahl <r.stahl@tum.de> | 2019-04-23 11:04:41 +0000 |
| commit | 850361f6c1db6bd8a85b65a8c56e0e097eaa0635 (patch) | |
| tree | d307c637054fa8ba3034e986e9bcd5d6f346e78b /clang/test/Analysis/ctu-main.cpp | |
| parent | 330bc8af131c5b42efe120dbf70f47881d02d3a3 (diff) | |
| download | bcm5719-llvm-850361f6c1db6bd8a85b65a8c56e0e097eaa0635.tar.gz bcm5719-llvm-850361f6c1db6bd8a85b65a8c56e0e097eaa0635.zip | |
[analyzer][CrossTU] Extend CTU to VarDecls with initializer
Summary:
The existing CTU mechanism imports `FunctionDecl`s where the definition is available in another TU. This patch extends that to VarDecls, to bind more constants.
- Add VarDecl importing functionality to CrossTranslationUnitContext
- Import Decls while traversing them in AnalysisConsumer
- Add VarDecls to CTU external mappings generator
- Name changes from "external function map" to "external definition map"
Reviewers: NoQ, dcoughlin, xazax.hun, george.karpenkov, martong
Reviewed By: xazax.hun
Subscribers: Charusso, baloghadamsoftware, mikhail.ramalho, Szelethus, donat.nagy, dkrupp, george.karpenkov, mgorny, whisperity, szepet, rnkovacs, a.sidorin, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D46421
llvm-svn: 358968
Diffstat (limited to 'clang/test/Analysis/ctu-main.cpp')
| -rw-r--r-- | clang/test/Analysis/ctu-main.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/clang/test/Analysis/ctu-main.cpp b/clang/test/Analysis/ctu-main.cpp index 03a47dfe0b0..a5de18bb3ec 100644 --- a/clang/test/Analysis/ctu-main.cpp +++ b/clang/test/Analysis/ctu-main.cpp @@ -60,6 +60,44 @@ int chf1(int x); int fun_using_anon_struct(int); int other_macro_diag(int); +extern const int extInt; +namespace intns { +extern const int extInt; +} +struct S { + int a; +}; +extern const S extS; +extern const int extHere; +const int extHere = 6; +struct A { + static const int a; +}; +struct SC { + const int a; +}; +extern SC extSC; +struct ST { + static struct SC sc; +}; +struct SCNest { + struct SCN { + const int a; + } scn; +}; +extern SCNest extSCN; +extern SCNest::SCN extSubSCN; +struct SCC { + SCC(int c); + const int a; +}; +extern SCC extSCC; +union U { + const int a; + const unsigned int b; +}; +extern U extU; + int main() { clang_analyzer_eval(f(3) == 2); // expected-warning{{TRUE}} clang_analyzer_eval(f(4) == 3); // expected-warning{{TRUE}} @@ -80,4 +118,16 @@ int main() { clang_analyzer_eval(other_macro_diag(1) == 1); // expected-warning{{TRUE}} // expected-warning@Inputs/ctu-other.cpp:80{{REACHABLE}} MACRODIAG(); // expected-warning{{REACHABLE}} + + clang_analyzer_eval(extInt == 2); // expected-warning{{TRUE}} + clang_analyzer_eval(intns::extInt == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(extS.a == 4); // expected-warning{{TRUE}} + clang_analyzer_eval(extHere == 6); // expected-warning{{TRUE}} + clang_analyzer_eval(A::a == 3); // expected-warning{{TRUE}} + clang_analyzer_eval(extSC.a == 8); // expected-warning{{TRUE}} + clang_analyzer_eval(ST::sc.a == 2); // expected-warning{{TRUE}} + // clang_analyzer_eval(extSCN.scn.a == 9); // TODO + clang_analyzer_eval(extSubSCN.a == 1); // expected-warning{{TRUE}} + // clang_analyzer_eval(extSCC.a == 7); // TODO + clang_analyzer_eval(extU.a == 4); // expected-warning{{TRUE}} } |

