diff --git include/clang/AST/ASTContext.h include/clang/AST/ASTContext.h
index c670069..82718d4 100644
--- include/clang/AST/ASTContext.h
+++ include/clang/AST/ASTContext.h
@@ -1496,11 +1496,7 @@ public:
 
   /// \brief Retrieves the canonical representation of the given
   /// calling convention.
-  CallingConv getCanonicalCallConv(CallingConv CC) const {
-    if (!LangOpts.MRTD && CC == CC_C)
-      return CC_Default;
-    return CC;
-  }
+  CallingConv getCanonicalCallConv(CallingConv CC) const;
 
   /// \brief Determines whether two calling conventions name the same
   /// calling convention.
diff --git lib/AST/ASTContext.cpp lib/AST/ASTContext.cpp
index 1d260b9..bee71b2 100644
--- lib/AST/ASTContext.cpp
+++ lib/AST/ASTContext.cpp
@@ -7099,6 +7099,12 @@ CallingConv ASTContext::getDefaultCXXMethodCallConv(bool isVariadic) {
   return ABI->getDefaultMethodCallConv(isVariadic);
 }
 
+CallingConv ASTContext::getCanonicalCallConv(CallingConv CC) const {
+  if (CC == CC_C && !LangOpts.MRTD && getTargetInfo().getCXXABI() != CXXABI_Microsoft)
+    return CC_Default;
+  return CC;
+}
+
 bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
   // Pass through to the C++ ABI object
   return ABI->isNearlyEmpty(RD);
diff --git test/CodeGenCXX/microsoft-abi-methods.cpp test/CodeGenCXX/microsoft-abi-methods.cpp
index f8ba51d..6b7f004 100644
--- test/CodeGenCXX/microsoft-abi-methods.cpp
+++ test/CodeGenCXX/microsoft-abi-methods.cpp
@@ -34,7 +34,7 @@ void call_cdecl_method() {
 // CHECK: ret
 
 // Make sure that the definition uses the right calling convention:
-// FIXME: define linkonce_odr void @"\01?cdecl_method@C@@QAAXXZ"
+// CHECK: define linkonce_odr void @"\01?cdecl_method@C@@QAAXXZ"
 // CHECK: ret
 }
 
