]> granicus.if.org Git - clang/commitdiff
[libclang] Fix hang in release / assertion in debug when evaluating value-dependent...
authorEmilio Cobos Alvarez <emilio@crisal.io>
Tue, 9 Jul 2019 14:27:01 +0000 (14:27 +0000)
committerEmilio Cobos Alvarez <emilio@crisal.io>
Tue, 9 Jul 2019 14:27:01 +0000 (14:27 +0000)
Expression evaluator doesn't work in value-dependent types, so ensure that the
precondition it asserts holds.

This fixes https://bugs.llvm.org/show_bug.cgi?id=42532

Differential Revision: https://reviews.llvm.org/D64409

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365490 91177308-0d34-0410-b5e6-96231b3b80d8

test/Index/evaluate-cursor.cpp
tools/libclang/CIndex.cpp

index 39fc9db98a3ef4fc733a2007f75f87c1670f1e6a..af396318aab7ea6dc4bf677545c5d629ffdb7b26 100644 (file)
@@ -21,6 +21,11 @@ unsigned long long HUGE = 1ull << 63;
 
 long long HUGE_NEG = -(1ll << 35);
 
+template <typename d> class e {
+  using f = d;
+  static const auto g = alignof(f);
+};
+
 // RUN: c-index-test -evaluate-cursor-at=%s:4:7 \
 // RUN:    -evaluate-cursor-at=%s:8:7 \
 // RUN:    -evaluate-cursor-at=%s:8:11 -std=c++11 %s | FileCheck %s
@@ -42,3 +47,9 @@ long long HUGE_NEG = -(1ll << 35);
 // CHECK-LONG: unsigned, Value: 1152921504606846976
 // CHECK-LONG: unsigned, Value: 9223372036854775808
 // CHECK-LONG: Value: -34359738368
+
+// RUN: c-index-test -evaluate-cursor-at=%s:18:20 \
+// RUN:    -evaluate-cursor-at=%s:20:20 \
+// RUN:    -evaluate-cursor-at=%s:26:21 \
+// RUN:    -std=c++11 %s | FileCheck -check-prefix=CHECK-DOES-NOT-CRASH %s
+// CHECK-DOES-NOT-CRASH: Not Evaluatable
index b3d2974b43b0df73ac9430cdfc95405863695088..17c40615335e9e5a7dbe4ed6c79d27f33f31f6b2 100644 (file)
@@ -3782,6 +3782,8 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
     return nullptr;
 
   expr = expr->IgnoreParens();
+  if (expr->isValueDependent())
+    return nullptr;
   if (!expr->EvaluateAsRValue(ER, ctx))
     return nullptr;