[clang] [clang][bytecode] Mark volatile composite locals as such (PR #174407)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 5 06:16:04 PST 2026
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/174407
We were forgetting to pass the volatile-ness along.
>From fb64e797c62d18b028e7b9902690f470bfa9e5d1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 5 Jan 2026 15:10:45 +0100
Subject: [PATCH] [clang][bytecode] Mark volatile composite locals as such
We were forgetting to pass the volatile-ness along.
---
clang/lib/AST/ByteCode/Compiler.cpp | 3 ++-
clang/test/AST/ByteCode/cxx23.cpp | 14 ++++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index f2021ef9456b7..b4449def1c6f0 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -4673,7 +4673,8 @@ UnsignedOrNone Compiler<Emitter>::allocateLocal(DeclTy &&Src, QualType Ty,
Descriptor *D = P.createDescriptor(
Src, Ty.getTypePtr(), Descriptor::InlineDescMD, Ty.isConstQualified(),
- IsTemporary, /*IsMutable=*/false, /*IsVolatile=*/false, Init);
+ IsTemporary, /*IsMutable=*/false, /*IsVolatile=*/Ty.isVolatileQualified(),
+ Init);
if (!D)
return std::nullopt;
D->IsConstexprUnknown = IsConstexprUnknown;
diff --git a/clang/test/AST/ByteCode/cxx23.cpp b/clang/test/AST/ByteCode/cxx23.cpp
index 819460628c1b7..2a8b061d7671a 100644
--- a/clang/test/AST/ByteCode/cxx23.cpp
+++ b/clang/test/AST/ByteCode/cxx23.cpp
@@ -450,6 +450,20 @@ namespace VolatileWrites {
// all-note {{in call to}}
}
+namespace VolatileReads {
+ constexpr int test1(bool b) {
+ if (!b)
+ return -1;
+ struct C {
+ int a;
+ };
+ volatile C c{12}; // all-note {{volatile object declared here}}
+ return ((C&)(c)).a; // all-note {{read of volatile object}}
+ }
+ static_assert(test1(true) == 0); // all-error {{not an integral constant expression}} \
+ // all-note {{in call to}}
+}
+
namespace AIEWithIndex0Narrows {
template <class _Tp> struct greater {
constexpr void operator()(_Tp, _Tp) {}
More information about the cfe-commits
mailing list