зеркало из https://github.com/microsoft/clang.git
Make Clang static analyzer skip function template definitions. This fixes Clang PR 8426, 8427, & 8433. Reviewed by Ted Kremenek and Doug Gregor.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117853 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
96e9366012
Коммит
739830d278
|
@ -211,8 +211,10 @@ void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
|
|||
case Decl::CXXMethod:
|
||||
case Decl::Function: {
|
||||
FunctionDecl* FD = cast<FunctionDecl>(D);
|
||||
|
||||
if (FD->isThisDeclarationADefinition()) {
|
||||
// We skip function template definitions, as their semantics is
|
||||
// only determined when they are instantiated.
|
||||
if (FD->isThisDeclarationADefinition() &&
|
||||
!FD->isDependentContext()) {
|
||||
if (!Opts.AnalyzeSpecificFunction.empty() &&
|
||||
FD->getDeclName().getAsString() != Opts.AnalyzeSpecificFunction)
|
||||
break;
|
||||
|
|
|
@ -159,3 +159,50 @@ int r8375510(R8375510 x, R8375510 y) {
|
|||
for (; ; x++) { }
|
||||
}
|
||||
|
||||
// PR8426 -- this used to crash.
|
||||
|
||||
void Use(void* to);
|
||||
|
||||
template <class T> class Foo {
|
||||
~Foo();
|
||||
struct Bar;
|
||||
Bar* bar_;
|
||||
};
|
||||
|
||||
template <class T> Foo<T>::~Foo() {
|
||||
Use(bar_);
|
||||
T::DoSomething();
|
||||
bar_->Work();
|
||||
}
|
||||
|
||||
// PR8427 -- this used to crash.
|
||||
|
||||
class Dummy {};
|
||||
|
||||
bool operator==(Dummy, int);
|
||||
|
||||
template <typename T>
|
||||
class Foo2 {
|
||||
bool Bar();
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
bool Foo2<T>::Bar() {
|
||||
return 0 == T();
|
||||
}
|
||||
|
||||
// PR8433 -- this used to crash.
|
||||
|
||||
template <typename T>
|
||||
class Foo3 {
|
||||
public:
|
||||
void Bar();
|
||||
void Baz();
|
||||
T value_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void Foo3<T>::Bar() {
|
||||
Baz();
|
||||
value_();
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче