From cf4a67bcbbb109347b1e2d6cedf69bae142a182f Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Wed, 30 Mar 2022 07:12:04 -0400 Subject: [PATCH] Don't diagnostic atomic object access as UB in an unevaluated context We started diagnosing this situation with a more clear diagnostic message, but it was pointed out that unevaluated contexts don't really have the undefined behavior property as there is no runtime access involved. This augments the changes in https://reviews.llvm.org/D122656 to not diagnose in an unevaluated context. --- clang/lib/Sema/SemaExprMember.cpp | 3 ++- clang/test/Sema/atomic-expr.c | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index 152b39dabe36..cb95f70f445b 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1298,7 +1298,8 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, // lvalue. Because this is inherently unsafe as an atomic operation, the // warning defaults to an error. if (const auto *ATy = BaseType->getAs()) { - S.Diag(OpLoc, diag::warn_atomic_member_access); + S.DiagRuntimeBehavior(OpLoc, nullptr, + S.PDiag(diag::warn_atomic_member_access)); BaseType = ATy->getValueType().getUnqualifiedType(); BaseExpr = ImplicitCastExpr::Create( S.Context, IsArrow ? S.Context.getPointerType(BaseType) : BaseType, diff --git a/clang/test/Sema/atomic-expr.c b/clang/test/Sema/atomic-expr.c index 86cd32ce338c..6c6823c84872 100644 --- a/clang/test/Sema/atomic-expr.c +++ b/clang/test/Sema/atomic-expr.c @@ -102,4 +102,10 @@ void func_16(void) { _Atomic(struct { int val; }) z; z.val = 12; // expected-error {{accessing a member of an atomic structure or union is undefined behavior}} int zval = z.val; // expected-error {{accessing a member of an atomic structure or union is undefined behavior}} + + // Don't diagnose in an unevaluated context, however. + (void)sizeof(x.val); + (void)sizeof(xp->val); + (void)sizeof(y.ival); + (void)sizeof(yp->ival); }