Files
clang-p2996/clang/test/Analysis/ctu-main.cpp
Aleksei Sidorin 04fbffcc52 [ASTImporter] Allow testing of import sequences; fix import of typedefs for anonymous decls
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
2018-04-24 10:11:53 +00:00

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}}
}