[libclang] Fix hang in release / assertion in debug when evaluating value-dependent types.

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

llvm-svn: 365490
This commit is contained in:
Emilio Cobos Alvarez 2019-07-09 14:27:01 +00:00
parent e0a3ee79c5
commit 743754501b
2 changed files with 13 additions and 0 deletions

View 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

View 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;