[clang] [clang][Frontend] Fix Sema::PerformImplicitConversion for atomic expressions (PR #107773)
https://github.com/daniel-petrovic created https://github.com/llvm/llvm-project/pull/107773 Fixes #106576 In `Sema::PerformImplicitConversion` for standard conversion sequence the NonAtomicToAtomic conversion is not reverted back after 3.rd conversion step if not starting from scalar initially. This solves this issue and also other issues like e.g. returning r-value atomic expressions where AtomicToNonAtomic conversion should also normally occur. Basically this means that atomicity is stripped after lvalue to rvalue conversoin of an atomic expression. >From 3ab605f2d939130d973892d21e538631cebb42bc Mon Sep 17 00:00:00 2001 From: Daniel Petrovic 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.c | 17 + 2 files changed, 22 insertions(+), 1 deletion(-) 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(); + 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()->getValueType(), From->getType())); From = ImpCastExprToType(From, ToAtomicType, CK_NonAtomicToAtomic, diff --git a/clang/test/Sema/atomic-expr.c b/clang/test/Sema/atomic-expr.c index 7e5219dd3f14ab..167de036ae73d6 100644 --- a/clang/test/Sema/atomic-expr.c +++ b/clang/test/Sema/atomic-expr.c @@ -227,3 +227,20 @@ void func_19(void) { _Atomic int a = 0; switch (a) { } } + +// Test correct implicit conversions of r-value atomic expressions. +// Bugfix: https://github.com/llvm/llvm-project/issues/106576 +typedef _Atomic char atomic_char; +atomic_char counter; +char load_stmtexpr() { + return ({counter;}); +} +char load_plus_one_stmtexpr() { + return ({counter;}) + 1; +} +char load_cast() { + return (atomic_char)('x'); +} +char load_cast_plus_one() { + return (atomic_char)('x') + 1; +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][Frontend] Fix Sema::PerformImplicitConversion for atomic expressions (PR #107773)
https://github.com/daniel-petrovic converted_to_draft https://github.com/llvm/llvm-project/pull/107773 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][Frontend] Fix Sema::PerformImplicitConversion for atomic expressions (PR #107773)
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 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(); + 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()->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 00..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
[clang] [clang] Fix crash in code with StmtExpr and atomic char load in Expr::EvaluateAsRValue. (PR #106751)
daniel-petrovic wrote: The statement expression should always provide r-value: https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html#details According https://en.cppreference.com/w/c/language/atomic: > Atomic properties are only meaningful for [lvalue > expressions](https://en.cppreference.com/w/c/language/value_category). > Lvalue-to-rvalue conversion (which models a memory read from an atomic > location to a CPU register) strips atomicity along with other qualifiers. To me it looks like that atomicity in StmExpr is not stripped away, but it should. E.g. : https://godbolt.org/z/WPdh9Yx5h ` `-RecoveryExpr 'char' contains-errors `-StmtExpr 'atomic_char':'_Atomic(char)'` https://github.com/llvm/llvm-project/pull/106751 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits