forked from OSchip/llvm-project
[analyzer] pr43036: Fix support for operator 'sizeof...'.
It was known to be a compile-time constant so it wasn't evaluated during symbolic execution, but it wasn't evaluated as a compile-time constant either. Differential Revision: https://reviews.llvm.org/D66565 llvm-svn: 370245
This commit is contained in:
parent
8b2a39e937
commit
0909a392f3
|
@ -108,6 +108,7 @@ SVal Environment::getSVal(const EnvironmentEntry &Entry,
|
|||
case Stmt::ObjCStringLiteralClass:
|
||||
case Stmt::StringLiteralClass:
|
||||
case Stmt::TypeTraitExprClass:
|
||||
case Stmt::SizeOfPackExprClass:
|
||||
// Known constants; defer to SValBuilder.
|
||||
return svalBuilder.getConstantVal(cast<Expr>(S)).getValue();
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection \
|
||||
// RUN: -verify %s
|
||||
|
||||
typedef __typeof(sizeof(int)) size_t;
|
||||
|
||||
void clang_analyzer_eval(bool);
|
||||
|
||||
template <int... N> size_t foo() {
|
||||
return sizeof...(N);
|
||||
}
|
||||
|
||||
void bar() {
|
||||
clang_analyzer_eval(foo<>() == 0); // expected-warning{{TRUE}}
|
||||
clang_analyzer_eval(foo<1, 2, 3>() == 3); // expected-warning{{TRUE}}
|
||||
}
|
Loading…
Reference in New Issue