[clang] 797994d - [clang][Interp] Strip _Atomic from _Complex types
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 14 08:57:25 PDT 2024
Author: Timm Bäder
Date: 2024-03-14T16:55:38+01:00
New Revision: 797994da3c3b0ff40201ac0045740370d2c39cbb
URL: https://github.com/llvm/llvm-project/commit/797994da3c3b0ff40201ac0045740370d2c39cbb
DIFF: https://github.com/llvm/llvm-project/commit/797994da3c3b0ff40201ac0045740370d2c39cbb.diff
LOG: [clang][Interp] Strip _Atomic from _Complex types
... when doing binary operations on them.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/complex.c
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 25f4e1ead7e3c9..088301c08b81bb 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -685,11 +685,17 @@ bool ByteCodeExprGen<Emitter>::VisitComplexBinOp(const BinaryOperator *E) {
if (!this->emitSetLocal(PT_Ptr, ResultOffset, E))
return false;
}
+ QualType LHSType = LHS->getType();
+ if (const auto *AT = LHSType->getAs<AtomicType>())
+ LHSType = AT->getValueType();
+ QualType RHSType = RHS->getType();
+ if (const auto *AT = RHSType->getAs<AtomicType>())
+ RHSType = AT->getValueType();
// Evaluate LHS and save value to LHSOffset.
bool LHSIsComplex;
unsigned LHSOffset;
- if (LHS->getType()->isAnyComplexType()) {
+ if (LHSType->isAnyComplexType()) {
LHSIsComplex = true;
LHSOffset = this->allocateLocalPrimitive(LHS, PT_Ptr, true, false);
if (!this->visit(LHS))
@@ -698,7 +704,7 @@ bool ByteCodeExprGen<Emitter>::VisitComplexBinOp(const BinaryOperator *E) {
return false;
} else {
LHSIsComplex = false;
- PrimType LHST = classifyPrim(LHS->getType());
+ PrimType LHST = classifyPrim(LHSType);
LHSOffset = this->allocateLocalPrimitive(LHS, LHST, true, false);
if (!this->visit(LHS))
return false;
@@ -709,7 +715,7 @@ bool ByteCodeExprGen<Emitter>::VisitComplexBinOp(const BinaryOperator *E) {
// Same with RHS.
bool RHSIsComplex;
unsigned RHSOffset;
- if (RHS->getType()->isAnyComplexType()) {
+ if (RHSType->isAnyComplexType()) {
RHSIsComplex = true;
RHSOffset = this->allocateLocalPrimitive(RHS, PT_Ptr, true, false);
if (!this->visit(RHS))
@@ -718,7 +724,7 @@ bool ByteCodeExprGen<Emitter>::VisitComplexBinOp(const BinaryOperator *E) {
return false;
} else {
RHSIsComplex = false;
- PrimType RHST = classifyPrim(RHS->getType());
+ PrimType RHST = classifyPrim(RHSType);
RHSOffset = this->allocateLocalPrimitive(RHS, RHST, true, false);
if (!this->visit(RHS))
return false;
diff --git a/clang/test/AST/Interp/complex.c b/clang/test/AST/Interp/complex.c
index b5f30b87baa79a..a39f83160ef8ca 100644
--- a/clang/test/AST/Interp/complex.c
+++ b/clang/test/AST/Interp/complex.c
@@ -19,3 +19,12 @@ const _Complex float FC = {0.0f, 0.0f};
_Static_assert(!FC, "");
const _Complex float FI = {0, 0};
_Static_assert(!FI, "");
+
+
+/// Make sure we're stripping the _Atomic part from the
+/// complex type.
+void testComplexFloat(_Atomic(_Complex float) *fp) {
+ _Atomic(_Complex float) x = 2.0f;
+ _Complex float f = *fp;
+ *fp = f;
+}
More information about the cfe-commits
mailing list