[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:
Artem Dergachev 2019-08-28 18:44:35 +00:00
parent 8b2a39e937
commit 0909a392f3
2 changed files with 16 additions and 0 deletions

View File

@ -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();

View File

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