emilio created this revision.
emilio added reviewers: Anastasia, arphaman.
Herald added subscribers: cfe-commits, dexonsmith.
Herald added a project: clang.
emilio edited the summary of this revision.
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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D64409
Files:
clang/test/Index/evaluate-cursor.cpp
clang/tools/libclang/CIndex.cpp
Index: clang/tools/libclang/CIndex.cpp
===================================================================
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -3782,6 +3782,8 @@
return nullptr;
expr = expr->IgnoreParens();
+ if (expr->isValueDependent())
+ return nullptr;
if (!expr->EvaluateAsRValue(ER, ctx))
return nullptr;
Index: clang/test/Index/evaluate-cursor.cpp
===================================================================
--- clang/test/Index/evaluate-cursor.cpp
+++ clang/test/Index/evaluate-cursor.cpp
@@ -21,6 +21,11 @@
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 @@
// 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: clang/tools/libclang/CIndex.cpp
===================================================================
--- clang/tools/libclang/CIndex.cpp
+++ clang/tools/libclang/CIndex.cpp
@@ -3782,6 +3782,8 @@
return nullptr;
expr = expr->IgnoreParens();
+ if (expr->isValueDependent())
+ return nullptr;
if (!expr->EvaluateAsRValue(ER, ctx))
return nullptr;
Index: clang/test/Index/evaluate-cursor.cpp
===================================================================
--- clang/test/Index/evaluate-cursor.cpp
+++ clang/test/Index/evaluate-cursor.cpp
@@ -21,6 +21,11 @@
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 @@
// 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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits