[cfe-commits] r151443 - in /cfe/trunk: lib/Sema/SemaExprMember.cpp test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp

Richard Smith richard-llvm at metafoo.co.uk
Sat Feb 25 02:04:08 PST 2012


Author: rsmith
Date: Sat Feb 25 04:04:07 2012
New Revision: 151443

URL: http://llvm.org/viewvc/llvm-project?rev=151443&view=rev
Log:
PR11956: C++11's special exception for accessing non-static data members from
unevaluated operands applies within member functions, too.

Modified:
    cfe/trunk/lib/Sema/SemaExprMember.cpp
    cfe/trunk/test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp

Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=151443&r1=151442&r2=151443&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprMember.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprMember.cpp Sat Feb 25 04:04:07 2012
@@ -138,25 +138,25 @@
   if (Classes.empty())
     return IMA_Static;
 
+  if (SemaRef.getLangOptions().CPlusPlus0x && isField) {
+    // C++11 [expr.prim.general]p12:
+    //   An id-expression that denotes a non-static data member or non-static
+    //   member function of a class can only be used:
+    //   (...)
+    //   - if that id-expression denotes a non-static data member and it
+    //     appears in an unevaluated operand.
+    const Sema::ExpressionEvaluationContextRecord& record
+      = SemaRef.ExprEvalContexts.back();
+    if (record.Context == Sema::Unevaluated)
+      return IMA_Field_Uneval_Context;
+  }
+
   // If the current context is not an instance method, it can't be
   // an implicit member reference.
   if (isStaticContext) {
     if (hasNonInstance)
-        return IMA_Mixed_StaticContext;
-        
-    if (SemaRef.getLangOptions().CPlusPlus0x && isField) {
-      // C++11 [expr.prim.general]p12:
-      //   An id-expression that denotes a non-static data member or non-static
-      //   member function of a class can only be used:
-      //   (...)
-      //   - if that id-expression denotes a non-static data member and it
-      //     appears in an unevaluated operand.
-      const Sema::ExpressionEvaluationContextRecord& record
-        = SemaRef.ExprEvalContexts.back();
-      if (record.Context == Sema::Unevaluated)
-        return IMA_Field_Uneval_Context;
-    }
-    
+      return IMA_Mixed_StaticContext;
+
     return IMA_Error_StaticContext;
   }
 

Modified: cfe/trunk/test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp?rev=151443&r1=151442&r2=151443&view=diff
==============================================================================
--- cfe/trunk/test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp (original)
+++ cfe/trunk/test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp Sat Feb 25 04:04:07 2012
@@ -27,4 +27,12 @@
 class Poly { virtual ~Poly(); };
 const std::type_info& k = typeid(S::m);
 const std::type_info& m = typeid(*(Poly*)S::m); // expected-error {{invalid use of nonstatic data member}}
-const std::type_info& n = typeid(*(Poly*)(0*sizeof S::m)); 
\ No newline at end of file
+const std::type_info& n = typeid(*(Poly*)(0*sizeof S::m)); 
+
+namespace PR11956 {
+  struct X { char a; };
+  struct Y { int f() { return sizeof(X::a); } }; // ok
+
+  struct A { enum E {} E; };
+  struct B { int f() { return sizeof(A::E); } }; // ok
+}





More information about the cfe-commits mailing list