summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilio Cobos Alvarez <emilio@crisal.io>2019-07-09 14:27:01 +0000
committerEmilio Cobos Alvarez <emilio@crisal.io>2019-07-09 14:27:01 +0000
commit743754501b36aba2f74acf8612048bc2adee46c4 (patch)
treeb0dead9d273b2887ce2df8ddb68bcf975c0328f4
parente0a3ee79c5ffdf076bc43ceb58ebaf73a41c7d8b (diff)
downloadbcm5719-llvm-743754501b36aba2f74acf8612048bc2adee46c4.tar.gz
bcm5719-llvm-743754501b36aba2f74acf8612048bc2adee46c4.zip
[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
-rw-r--r--clang/test/Index/evaluate-cursor.cpp11
-rw-r--r--clang/tools/libclang/CIndex.cpp2
2 files changed, 13 insertions, 0 deletions
diff --git a/clang/test/Index/evaluate-cursor.cpp b/clang/test/Index/evaluate-cursor.cpp
index 39fc9db98a3..af396318aab 100644
--- a/clang/test/Index/evaluate-cursor.cpp
+++ b/clang/test/Index/evaluate-cursor.cpp
@@ -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
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index b3d2974b43b..17c40615335 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -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;
OpenPOWER on IntegriCloud