https://github.com/daniel-petrovic updated 
https://github.com/llvm/llvm-project/pull/107773

>From 20f065d70ab4ff8b3f77b53db6ce6cf1033e00aa Mon Sep 17 00:00:00 2001
From: Daniel Petrovic <daniel.petro...@ebcont.com>
Date: Sun, 8 Sep 2024 21:29:57 +0200
Subject: [PATCH] [clang][Frontend] Fix Sema::PerformImplicitConversion for
 atomic expressions

---
 clang/lib/Sema/SemaExprCXX.cpp       |  6 +++++-
 clang/test/Sema/atomic-expr-rvalue.c | 23 +++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/atomic-expr-rvalue.c

diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 746c67ff1e979f..24d0df132d6648 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -4393,6 +4393,10 @@ Sema::PerformImplicitConversion(Expr *From, QualType 
ToType,
     ToType = ToAtomic->getValueType();
   }
 
+  // Save the initial `atomicity` information of the From-expression for later 
check
+  // before it's potentially removed in the StandardConversionSequence steps 
1-3.
+  const AtomicType* StartingFromAtomic = From->getType()->getAs<AtomicType>();
+
   QualType InitialFromType = FromType;
   // Perform the first implicit conversion.
   switch (SCS.First) {
@@ -4918,7 +4922,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType 
ToType,
 
   // If this conversion sequence involved a scalar -> atomic conversion, 
perform
   // that conversion now.
-  if (!ToAtomicType.isNull()) {
+  if (!StartingFromAtomic && !ToAtomicType.isNull()) {
     assert(Context.hasSameType(
         ToAtomicType->castAs<AtomicType>()->getValueType(), From->getType()));
     From = ImpCastExprToType(From, ToAtomicType, CK_NonAtomicToAtomic,
diff --git a/clang/test/Sema/atomic-expr-rvalue.c 
b/clang/test/Sema/atomic-expr-rvalue.c
new file mode 100644
index 00000000000000..8314afd9ecb051
--- /dev/null
+++ b/clang/test/Sema/atomic-expr-rvalue.c
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -fsyntax-only %s -verify
+// expected-no-diagnostics
+
+typedef _Atomic char atomic_char;
+atomic_char counter;
+
+// Check correct implicit conversions of r-value atomic expressions.
+// Bugfix: https://github.com/llvm/llvm-project/issues/106576
+char load_plus_one_stmtexpr() {
+  return ({counter;}) + 1;
+}
+
+char load_stmtexpr() {
+  return ({counter;});
+}
+
+char load_cast_plus_one() {
+  return (atomic_char)('x') + 1;
+}
+
+char load_cast() {
+  return (atomic_char)('x');
+}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to