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