Hi rsmith,

Some standard header files from MSVC2012 use 'mutable' on references, though it 
is directly prohibited by the standard.

http://reviews.llvm.org/D7370

Files:
  lib/Sema/SemaDecl.cpp
  test/SemaCXX/ms_mutable_reference_member.cpp

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

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
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;
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to