[clang] [Clang] Rewrite SourceLocExpr in default args (PR #93383)
via cfe-commits
cfe-commits at lists.llvm.org
Sun May 26 00:18:08 PDT 2024
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/93383
>From ce5f58180635968c1525b9a3d267f91c495f3058 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Sat, 25 May 2024 20:49:22 +0200
Subject: [PATCH 1/2] [Clang] Rewrite SourceLocExpr in default args
In order for their dependency to be computed correctly,
SourceLocExpr should refer to the context in which they are used.
Fixes #92680
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/lib/Sema/SemaExpr.cpp | 9 +++++++++
clang/test/SemaCXX/source_location.cpp | 17 +++++++++++++++++
3 files changed, 28 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7bcdee96e213e..3f2c3c1e5a65d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -771,6 +771,8 @@ Bug Fixes to C++ Support
Fixes (#GH87210), (GH89541).
- Clang no longer tries to check if an expression is immediate-escalating in an unevaluated context.
Fixes (#GH91308).
+- Fix a crash caused by a regression in the handling of ``source_location``
+ in dependent contexts. Fixes (#GH92680).
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ff9c5ead36dcf..ef3162ca989c4 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -5506,6 +5506,15 @@ struct EnsureImmediateInvocationInDefaultArgs
// cause it to incorrectly point it to the outermost class
// in the case of nested struct initialization.
ExprResult TransformCXXThisExpr(CXXThisExpr *E) { return E; }
+
+ // Rewrite to source location to refer to the context in which they are used
+ ExprResult TransformSourceLocExpr(SourceLocExpr *E) {
+ if (E->getParentContext() == SemaRef.CurContext)
+ return E;
+ return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
+ E->getBeginLoc(), E->getEndLoc(),
+ SemaRef.CurContext);
+ }
};
ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
diff --git a/clang/test/SemaCXX/source_location.cpp b/clang/test/SemaCXX/source_location.cpp
index 63157cfacdd98..6b3610d703e71 100644
--- a/clang/test/SemaCXX/source_location.cpp
+++ b/clang/test/SemaCXX/source_location.cpp
@@ -912,3 +912,20 @@ auto g() {
}
}
+
+namespace GH92680 {
+
+struct IntConstuctible {
+ IntConstuctible(std::source_location = std::source_location::current());
+};
+
+template <typename>
+auto construct_at(IntConstuctible) -> decltype(IntConstuctible()) {
+ return {};
+}
+
+void test() {
+ construct_at<IntConstuctible>({});
+}
+
+}
>From ec59077109616b62a1421aab034caa6cb6148fe4 Mon Sep 17 00:00:00 2001
From: cor3ntin <corentinjabot at gmail.com>
Date: Sun, 26 May 2024 09:18:00 +0200
Subject: [PATCH 2/2] Update clang/lib/Sema/SemaExpr.cpp
Co-authored-by: Timm Baeder <tbaeder at redhat.com>
---
clang/lib/Sema/SemaExpr.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ef3162ca989c4..410f80ae864a1 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -5507,7 +5507,7 @@ struct EnsureImmediateInvocationInDefaultArgs
// in the case of nested struct initialization.
ExprResult TransformCXXThisExpr(CXXThisExpr *E) { return E; }
- // Rewrite to source location to refer to the context in which they are used
+ // Rewrite to source location to refer to the context in which they are used.
ExprResult TransformSourceLocExpr(SourceLocExpr *E) {
if (E->getParentContext() == SemaRef.CurContext)
return E;
More information about the cfe-commits
mailing list