Index: clang/lib/Sema/SemaExprMember.cpp =================================================================== --- clang/lib/Sema/SemaExprMember.cpp +++ clang/lib/Sema/SemaExprMember.cpp @@ -1298,7 +1298,8 @@ // 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, Index: clang/test/Sema/atomic-expr.c =================================================================== --- clang/test/Sema/atomic-expr.c +++ clang/test/Sema/atomic-expr.c @@ -102,4 +102,10 @@ _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); }