This patch introduces the ability to test an arbitrary sequence of imports between a given set of virtual source files. This should finally allow us to write simple tests and fix annoying issues inside ASTImporter that cause failures in CSA CTU. This is done by refactoring ASTImporterTest functions and introducing `testImportSequence` facility. As a side effect, `testImport` facility was generalized a bit more. It should now allow import of non-decl AST nodes; however, there is still no test using this ability. As a "test for test", there is also a fix for import anonymous TagDecls referred by typedef. Before this patch, the setting of typedef for anonymous structure was delayed; however, this approach misses the corner case if an enum constant is imported directly. In this patch, typedefs for anonymous declarations are imported right after the anonymous declaration is imported, without any delay. Thanks to Adam Balogh for suggestions included into this patch. Differential Revision: https://reviews.llvm.org/D44079 llvm-svn: 330704
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
// RUN: mkdir -p %T/ctudir
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-pch -o %T/ctudir/ctu-other.cpp.ast %S/Inputs/ctu-other.cpp
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-pch -o %T/ctudir/ctu-chain.cpp.ast %S/Inputs/ctu-chain.cpp
|
|
// RUN: cp %S/Inputs/externalFnMap.txt %T/ctudir/
|
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config experimental-enable-naive-ctu-analysis=true -analyzer-config ctu-dir=%T/ctudir -verify %s
|
|
|
|
void clang_analyzer_eval(int);
|
|
|
|
int f(int);
|
|
int g(int);
|
|
int h(int);
|
|
|
|
int callback_to_main(int x) { return x + 1; }
|
|
|
|
namespace myns {
|
|
int fns(int x);
|
|
|
|
namespace embed_ns {
|
|
int fens(int x);
|
|
}
|
|
|
|
class embed_cls {
|
|
public:
|
|
int fecl(int x);
|
|
};
|
|
}
|
|
|
|
class mycls {
|
|
public:
|
|
int fcl(int x);
|
|
static int fscl(int x);
|
|
|
|
class embed_cls2 {
|
|
public:
|
|
int fecl2(int x);
|
|
};
|
|
};
|
|
|
|
namespace chns {
|
|
int chf1(int x);
|
|
}
|
|
|
|
int fun_using_anon_struct(int);
|
|
|
|
int main() {
|
|
clang_analyzer_eval(f(3) == 2); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(f(4) == 3); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(f(5) == 3); // expected-warning{{FALSE}}
|
|
clang_analyzer_eval(g(4) == 6); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(h(2) == 8); // expected-warning{{TRUE}}
|
|
|
|
clang_analyzer_eval(myns::fns(2) == 9); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(myns::embed_ns::fens(2) == -1); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(mycls().fcl(1) == 6); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(mycls::fscl(1) == 7); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(myns::embed_cls().fecl(1) == -6); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(mycls::embed_cls2().fecl2(0) == -11); // expected-warning{{TRUE}}
|
|
|
|
clang_analyzer_eval(chns::chf1(4) == 12); // expected-warning{{TRUE}}
|
|
clang_analyzer_eval(fun_using_anon_struct(8) == 8); // expected-warning{{TRUE}}
|
|
}
|