Index: test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p8.cpp
===================================================================
--- test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p8.cpp	(revision 169670)
+++ test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p8.cpp	(working copy)
@@ -36,3 +36,7 @@
   NonLiteralClass(bool);
   static constexpr bool isDebugFlag();
 };
+
+constexpr bool NonLiteralClass::isDebugFlag() {
+  return true;
+}
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 169670)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -2215,6 +2215,23 @@
     //   return type and the parameter-type-list.
     // We also want to respect all the extended bits except noreturn.
 
+    // C++0x [dcl.constexpr]p8: A constexpr specifier for a non-static member
+    // function that is not a constructor declares that function to be const.
+    // FIXME: GetFullTypeForDeclarator errantly makes all 
+    // static constexpr functions const, so we undo this here
+    const FunctionType *FnTy = New->getType()->getAs<FunctionType>();
+    if (New->isConstexpr() && (New->getStorageClass() == SC_Static || 
+        Old->getStorageClass() == SC_Static) && FnTy->isConst()) {
+      // Rebuild function type adding a 'const' qualifier.
+      QualType qt = QualType(FnTy, 0);
+      qt = qt.withExactLocalFastQualifiers(
+        qt.getLocalFastQualifiers() & !Qualifiers::Const);
+      New->setType(qt);
+      NewQType = Context.getCanonicalType(New->getType());
+      Old->setType(qt);
+      OldQType = Context.getCanonicalType(Old->getType());
+    }
+
     // noreturn should now match unless the old type info didn't have it.
     QualType OldQTypeForComparison = OldQType;
     if (!OldTypeInfo.getNoReturn() && NewTypeInfo.getNoReturn()) {
