diff options
author | Ed Schouten <ed@FreeBSD.org> | 2009-06-08 15:36:55 +0000 |
---|---|---|
committer | Ed Schouten <ed@FreeBSD.org> | 2009-06-08 15:36:55 +0000 |
commit | 8ba99c00327a4394e7568244d6cffd6e62625a7a (patch) | |
tree | 7ab9fa5634c95f5df8575db81b24ea5586e65b28 /lib/Sema/SemaTemplateDeduction.cpp | |
parent | 70b4596d9d0d559e94f9bad8f43463e5d98a577e (diff) |
Diffstat (limited to 'lib/Sema/SemaTemplateDeduction.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index 812b319804d7..db7e622f7f68 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -265,6 +265,37 @@ static bool DeduceTemplateArguments(ASTContext &Context, QualType Param, return false; } + case Type::FunctionProto: { + const FunctionProtoType *FunctionProtoArg = + dyn_cast<FunctionProtoType>(Arg); + if (!FunctionProtoArg) + return false; + + const FunctionProtoType *FunctionProtoParam = + cast<FunctionProtoType>(Param); + + // Check return types. + if (!DeduceTemplateArguments(Context, + FunctionProtoParam->getResultType(), + FunctionProtoArg->getResultType(), + Deduced)) + return false; + + if (FunctionProtoParam->getNumArgs() != FunctionProtoArg->getNumArgs()) + return false; + + for (unsigned I = 0, N = FunctionProtoParam->getNumArgs(); I != N; ++I) { + // Check argument types. + if (!DeduceTemplateArguments(Context, + FunctionProtoParam->getArgType(I), + FunctionProtoArg->getArgType(I), + Deduced)) + return false; + } + + return true; + } + default: break; } |