]> granicus.if.org Git - clang/commitdiff
Emulate a MSVC bug where the creation of pointer-to-member to protected member of...
authorFrancois Pichet <pichet2000@gmail.com>
Tue, 17 Apr 2012 12:35:05 +0000 (12:35 +0000)
committerFrancois Pichet <pichet2000@gmail.com>
Tue, 17 Apr 2012 12:35:05 +0000 (12:35 +0000)
This fixes a regression when parsing MFC code with clang.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154924 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaAccess.cpp
test/Parser/MicrosoftExtensions.cpp

index dea5e76d9e13c7a699baf4b6980aa99bfdf93119..024838d4d4a65e32b410de5a6132c225b4e78911 100644 (file)
@@ -779,6 +779,13 @@ static AccessResult HasAccess(Sema &S,
         // that the naming class has to be derived from the effective
         // context.
 
+        // Emulate a MSVC bug where the creation of pointer-to-member
+        // to protected member of base class is allowed but only from
+        // a static function.
+        if (S.getLangOpts().MicrosoftMode && !EC.Functions.empty() &&
+            EC.Functions.front()->getStorageClass() == SC_Static)
+           return AR_accessible;
+
         // Despite the standard's confident wording, there is a case
         // where you can have an instance member that's neither in a
         // pointer-to-member expression nor in a member access:  when
index c6b3dfd691a0805cec0712cf380442f170270726..3a1ffea453caa925e312016fef8aa27fff23597b 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions -fdelayed-template-parsing
+// RUN: %clang_cc1 %s -std=c++11 -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-extensions -fms-compatibility -fdelayed-template-parsing
 
 /* Microsoft attribute tests */
 [repeatable][source_annotation_attribute( Parameter|ReturnValue )]
@@ -284,3 +284,28 @@ int main () {
   missing_template_keyword<int>();
 }
 
+
+
+\r
+namespace access_protected_PTM {\r
+\r
+class A {\r
+protected:\r
+  void f(); // expected-note {{must name member using the type of the current context 'access_protected_PTM::B'}}\r
+};\r
+\r
+class B : public A{\r
+public:\r
+  void test_access();\r
+  static void test_access_static();\r
+};\r
+\r
+void B::test_access() {\r
+  &A::f; // expected-error {{'f' is a protected member of 'access_protected_PTM::A'}}\r
+}\r
+\r
+void B::test_access_static() {\r
+  &A::f;\r
+}\r
+\r
+}
\ No newline at end of file