[clang] [clang][SemaCXX] Fix crash when using static_cast to _Atomic types in C++ (PR #207616)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 6 07:35:55 PDT 2026
================
@@ -111,3 +111,12 @@ namespace non_trivially_copyable {
_Atomic S s; // expected-error {{_Atomic cannot be applied to type 'S' which is not trivially copyable}} \
// expected-warning {{'_Atomic' is a C11 extension}}
}
+
+namespace static_cast_crash {
+ struct S { char a; };
+ void static_cast_non_atomic_to_atomic() {
+ _Atomic struct S a; // expected-warning {{'_Atomic' is a C11 extension}}
+ a = static_cast<_Atomic(struct S)>(S()); // expected-warning {{'_Atomic' is a C11 extension}}
----------------
AaronBallman wrote:
Another interesting test case:
```
struct S {
operator float() const;
int a;
};
struct T {
operator _Atomic(S)() const;
};
void static_cast_non_atomic_to_atomic() {
_Atomic struct S s;
s = static_cast<_Atomic(S)>(T{});
}
```
This fails today but should succeed with your patch. But then there's the sadder test case:
```
struct S {
operator float() const;
int a;
};
struct T {
operator _Atomic(S)() const;
};
void static_cast_non_atomic_to_atomic() {
float f;
f = static_cast<float>(static_cast<_Atomic(S)>(T{}));
}
```
This *won't* work because the atomic is not being stripped from the cast and you cannot access members of an atomic object (so no way to call the conversion operator).
https://github.com/llvm/llvm-project/pull/207616
More information about the cfe-commits
mailing list