Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -12347,7 +12347,7 @@ // Check that 'mutable' is consistent with the type of the declaration. if (!InvalidDecl && Mutable) { unsigned DiagID = 0; - if (T->isReferenceType()) + if (!getLangOpts().MSVCCompat && T->isReferenceType()) DiagID = diag::err_mutable_reference; else if (T.isConstQualified()) DiagID = diag::err_mutable_const; Index: test/SemaCXX/ms_mutable_reference_member.cpp =================================================================== --- test/SemaCXX/ms_mutable_reference_member.cpp +++ test/SemaCXX/ms_mutable_reference_member.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-compatibility +// expected-no-diagnostics + +struct S { + mutable int &a; + S(int &b) : a(b) {} +}; + +int main() { + int a = 0; + const S s(a); + s.a = 10; + return s.a + a; +}