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); }