[clang] [clang][bytecode] Add init link for the RVO ptr (PR #122904)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 14 06:11:24 PST 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/122904
None
>From 24b323b514d130b12898eaeb63da05f6456e2f79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Tue, 14 Jan 2025 15:09:50 +0100
Subject: [PATCH] [clang][bytecode] Add init link for the RVO ptr
---
clang/lib/AST/ByteCode/Compiler.cpp | 3 +++
clang/lib/AST/ByteCode/Compiler.h | 4 +++-
clang/test/AST/ByteCode/cxx11.cpp | 11 +++++++++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 2326480fe2eaf4..a5dfaaf3196559 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -90,6 +90,8 @@ bool InitLink::emit(Compiler<Emitter> *Ctx, const Expr *E) const {
if (!Ctx->emitConstUint32(Offset, E))
return false;
return Ctx->emitArrayElemPtrPopUint32(E);
+ case K_RVO:
+ return Ctx->emitRVOPtr(E);
case K_InitList:
return true;
default:
@@ -4998,6 +5000,7 @@ bool Compiler<Emitter>::visitReturnStmt(const ReturnStmt *RS) {
if (!this->visit(RE))
return false;
} else {
+ InitLinkScope<Emitter> ILS(this, InitLink::RVO());
// RVO - construct the value in the return location.
if (!this->emitRVOPtr(RE))
return false;
diff --git a/clang/lib/AST/ByteCode/Compiler.h b/clang/lib/AST/ByteCode/Compiler.h
index 2d5b76f789543e..f9a597a16ef4ae 100644
--- a/clang/lib/AST/ByteCode/Compiler.h
+++ b/clang/lib/AST/ByteCode/Compiler.h
@@ -51,11 +51,13 @@ struct InitLink {
K_Temp = 2,
K_Decl = 3,
K_Elem = 5,
- K_InitList = 6
+ K_RVO = 6,
+ K_InitList = 7
};
static InitLink This() { return InitLink{K_This}; }
static InitLink InitList() { return InitLink{K_InitList}; }
+ static InitLink RVO() { return InitLink{K_RVO}; }
static InitLink Field(unsigned Offset) {
InitLink IL{K_Field};
IL.Offset = Offset;
diff --git a/clang/test/AST/ByteCode/cxx11.cpp b/clang/test/AST/ByteCode/cxx11.cpp
index 86b58283023bc8..23582e9ab556a8 100644
--- a/clang/test/AST/ByteCode/cxx11.cpp
+++ b/clang/test/AST/ByteCode/cxx11.cpp
@@ -174,3 +174,14 @@ void lambdas() {
int d;
int a9[1] = {[d = 0] = 1}; // both-error {{not an integral constant expression}}
}
+
+
+namespace InitLinkToRVO {
+ struct A {
+ int y = 3;
+ int z = 1 + y;
+ };
+
+ constexpr A make() { return A {}; }
+ static_assert(make().z == 4, "");
+}
More information about the cfe-commits
mailing list