Răsfoiți Sursa

[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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@370245 91177308-0d34-0410-b5e6-96231b3b80d8
Artem Dergachev 6 ani în urmă
părinte
comite
c07bc247e6
2 a modificat fișierele cu 16 adăugiri și 0 ștergeri
  1. 1 0
      lib/StaticAnalyzer/Core/Environment.cpp
  2. 15 0
      test/Analysis/sizeofpack.cpp

+ 1 - 0
lib/StaticAnalyzer/Core/Environment.cpp

@@ -108,6 +108,7 @@ SVal Environment::getSVal(const EnvironmentEntry &Entry,
   case Stmt::ObjCStringLiteralClass:
   case Stmt::ObjCStringLiteralClass:
   case Stmt::StringLiteralClass:
   case Stmt::StringLiteralClass:
   case Stmt::TypeTraitExprClass:
   case Stmt::TypeTraitExprClass:
+  case Stmt::SizeOfPackExprClass:
     // Known constants; defer to SValBuilder.
     // Known constants; defer to SValBuilder.
     return svalBuilder.getConstantVal(cast<Expr>(S)).getValue();
     return svalBuilder.getConstantVal(cast<Expr>(S)).getValue();
 
 

+ 15 - 0
test/Analysis/sizeofpack.cpp

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