[clang] 136f2ba - [Clang][AST] Fix HandleLValueBase to deal with references (#140105)
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 15 16:04:40 PDT 2025
Author: Shafik Yaghmour
Date: 2025-05-15T16:04:37-07:00
New Revision: 136f2ba2a7bca015ef831c91fb0db5e5e31b7632
URL: https://github.com/llvm/llvm-project/commit/136f2ba2a7bca015ef831c91fb0db5e5e31b7632
DIFF: https://github.com/llvm/llvm-project/commit/136f2ba2a7bca015ef831c91fb0db5e5e31b7632.diff
LOG: [Clang][AST] Fix HandleLValueBase to deal with references (#140105)
Since P2280R4 Unknown references and pointers was implemented,
HandleLValueBase now has to deal with referneces:
D.MostDerivedType->getAsCXXRecordDecl()
will return a nullptr if D.MostDerivedType is a ReferenceType. The fix
is to use getNonReferenceType() to obtain the Pointee Type if we have a
reference.
Fixes: https://github.com/llvm/llvm-project/issues/139452
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-p2280r4.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 985cf264876e9..4e5875c043cf2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -615,6 +615,8 @@ Bug Fixes in This Version
argument which contains a pragma. (#GH113722)
- Fixed assertion failures when generating name lookup table in modules. (#GH61065, #GH134739)
- Fixed an assertion failure in constant compound literal statements. (#GH139160)
+- Fix crash due to unknown references and pointer implementation and handling of
+ base classes. (GH139452)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 86dbb349fd1a7..ca1fbdf7e652f 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -3314,7 +3314,11 @@ static bool HandleLValueBase(EvalInfo &Info, const Expr *E, LValue &Obj,
return false;
// Extract most-derived object and corresponding type.
- DerivedDecl = D.MostDerivedType->getAsCXXRecordDecl();
+ // FIXME: After implementing P2280R4 it became possible to get references
+ // here. We do MostDerivedType->getAsCXXRecordDecl() in several other
+ // locations and if we see crashes in those locations in the future
+ // it may make more sense to move this fix into Lvalue::set.
+ DerivedDecl = D.MostDerivedType.getNonReferenceType()->getAsCXXRecordDecl();
if (!CastToDerivedClass(Info, E, Obj, DerivedDecl, D.MostDerivedPathLength))
return false;
diff --git a/clang/test/SemaCXX/constant-expression-p2280r4.cpp b/clang/test/SemaCXX/constant-expression-p2280r4.cpp
index 0cdc16ed4e822..88e0a8f153b10 100644
--- a/clang/test/SemaCXX/constant-expression-p2280r4.cpp
+++ b/clang/test/SemaCXX/constant-expression-p2280r4.cpp
@@ -178,3 +178,24 @@ namespace extern_reference_used_as_unknown {
int y;
constinit int& g = (x,y); // expected-warning {{left operand of comma operator has no effect}}
}
+
+namespace GH139452 {
+struct Dummy {
+ explicit operator bool() const noexcept { return true; }
+};
+
+struct Base { int error; };
+struct Derived : virtual Base { };
+
+template <class R>
+constexpr R get_value() {
+ const auto& derived_val = Derived{};
+ if (derived_val.error != 0)
+ /* nothing */;
+ return R{};
+}
+
+int f() {
+ return !get_value<Dummy>(); // contextually convert the function call result to bool
+}
+}
More information about the cfe-commits
mailing list