Merging r195154:
------------------------------------------------------------------------
r195154 | rafael | 2013-11-19 13:07:04 -0800 (Tue, 19 Nov 2013) | 15 lines

Further fixes when thiscall is the default for methods.

The previous patches tried to deduce the correct function type. I now realize
this is not possible in general. Consider

class foo {
    template <typename T> static void bar(T v);
};
extern template void foo::bar(const void *);

We will only know that bar is static after a lookup, so we have to handle this
in the template instantiation code.

This patch reverts my previous two changes (but not the tests) and instead
handles the issue in DeduceTemplateArguments.
------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_34@195226 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp
index b401db2..56df8ba 100644
--- a/lib/Sema/SemaTemplateDeduction.cpp
+++ b/lib/Sema/SemaTemplateDeduction.cpp
@@ -3538,6 +3538,23 @@
   TemplateParameterList *TemplateParams
     = FunctionTemplate->getTemplateParameters();
   QualType FunctionType = Function->getType();
+  if (!InOverloadResolution && !ArgFunctionType.isNull()) {
+    const FunctionProtoType *FunctionTypeP =
+        FunctionType->castAs<FunctionProtoType>();
+    CallingConv CC = FunctionTypeP->getCallConv();
+    bool NoReturn = FunctionTypeP->getNoReturnAttr();
+    const FunctionProtoType *ArgFunctionTypeP =
+        ArgFunctionType->getAs<FunctionProtoType>();
+    if (ArgFunctionTypeP->getCallConv() != CC ||
+        ArgFunctionTypeP->getNoReturnAttr() != NoReturn) {
+      FunctionType::ExtInfo EI =
+          ArgFunctionTypeP->getExtInfo().withCallingConv(CC);
+      EI = EI.withNoReturn(NoReturn);
+      ArgFunctionTypeP = cast<FunctionProtoType>(
+          Context.adjustFunctionType(ArgFunctionTypeP, EI));
+      ArgFunctionType = QualType(ArgFunctionTypeP, 0);
+    }
+  }
 
   // Substitute any explicit template arguments.
   LocalInstantiationScope InstScope(*this);