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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits