[clang] [C] Fix issue with -Wimplicit-void-ptr-cast (PR #154351)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 19 07:47:18 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Aaron Ballman (AaronBallman)
<details>
<summary>Changes</summary>
The changes from https://github.com/llvm/llvm-project/pull/136855 missed a change with atomic assignment constraints. This fixes a bug where we'd accidentally drop a non-atomic-to-atomic conversion step.
Fixes #<!-- -->154157
co-authored-by: @<!-- -->ahatanak
---
Full diff: https://github.com/llvm/llvm-project/pull/154351.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaExpr.cpp (+4-4)
- (modified) clang/test/Sema/implicit-void-ptr-cast.c (+8)
``````````diff
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 237c068f59283..265cd799373a5 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -9317,14 +9317,14 @@ AssignConvertType Sema::CheckAssignmentConstraints(QualType LHSType,
// If we have an atomic type, try a non-atomic assignment, then just add an
// atomic qualification step.
if (const AtomicType *AtomicTy = dyn_cast<AtomicType>(LHSType)) {
- AssignConvertType result =
+ AssignConvertType Result =
CheckAssignmentConstraints(AtomicTy->getValueType(), RHS, Kind);
- if (result != AssignConvertType::Compatible)
- return result;
+ if (!IsAssignConvertCompatible(Result))
+ return Result;
if (Kind != CK_NoOp && ConvertRHS)
RHS = ImpCastExprToType(RHS.get(), AtomicTy->getValueType(), Kind);
Kind = CK_NonAtomicToAtomic;
- return AssignConvertType::Compatible;
+ return Result;
}
// If the left-hand side is a reference type, then we are in a
diff --git a/clang/test/Sema/implicit-void-ptr-cast.c b/clang/test/Sema/implicit-void-ptr-cast.c
index 3c3e153d1dbda..1a8e1574907d4 100644
--- a/clang/test/Sema/implicit-void-ptr-cast.c
+++ b/clang/test/Sema/implicit-void-ptr-cast.c
@@ -82,3 +82,11 @@ void more(void) {
ptr3 = SOMETHING_THAT_IS_NOT_NULL; // c-warning {{implicit conversion when assigning to 'char *' from type 'void *' is not permitted in C++}} \
cxx-error {{assigning to 'char *' from incompatible type 'void *'}}
}
+
+void gh154157(void) {
+ #define ATOMIC_VAR_INIT(value) (value)
+
+ typedef const struct T * T_Ref;
+ static T_Ref _Atomic x = ATOMIC_VAR_INIT((void*)NULL); // c-warning {{implicit conversion when initializing '_Atomic(T_Ref)' with an expression of type 'void *' is not permitted in C++}} \
+ cxx-error {{cannot initialize a variable of type '_Atomic(T_Ref)' with an rvalue of type 'void *'}}
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/154351
More information about the cfe-commits
mailing list