================ @@ -3911,14 +3926,31 @@ ExprResult Sema::BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange, } } - // Pointer to object of size zero is not allowed. - if (RequireCompleteType(Ptr->getBeginLoc(), AtomTy, - diag::err_incomplete_type)) - return ExprError(); - if (Context.getTypeInfoInChars(AtomTy).Width.isZero()) { - Diag(ExprRange.getBegin(), diag::err_atomic_builtin_must_be_pointer) - << Ptr->getType() << 1 << Ptr->getSourceRange(); - return ExprError(); + if (Form != TestAndSet && Form != Clear) { + // Pointer to object of size zero is not allowed. + if (RequireCompleteType(Ptr->getBeginLoc(), AtomTy, + diag::err_incomplete_type)) + return ExprError(); + + if (Context.getTypeInfoInChars(AtomTy).Width.isZero()) { + Diag(ExprRange.getBegin(), diag::err_atomic_builtin_must_be_pointer) + << Ptr->getType() << 1 << Ptr->getSourceRange(); + return ExprError(); + } + } else { + // The __atomic_clear and __atomic_test_and_set intrinsics accept any ---------------- ostannard wrote:
I've tried that, but it results in the block above, which reports an error is a const pointer is used, always printing a `char *` type instead of the actual type from the source code. However I can update this to keep `AtomTy` and `ValType` up to date when the pointer type changes, so that the rest of the checks work correctly. https://github.com/llvm/llvm-project/pull/121943 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits