diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-06-08 15:19:08 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-06-08 15:19:08 +0000 |
| commit | 2128ec7cdde4dd3679c0e471455ea57db86aab77 (patch) | |
| tree | 30ab41c613cff4d5795cf6a9e0583e3bea631dc9 /clang/lib | |
| parent | 06de2b5525de9970dd0c5c858e91c5bb3edd3e0f (diff) | |
| download | bcm5719-llvm-2128ec7cdde4dd3679c0e471455ea57db86aab77.tar.gz bcm5719-llvm-2128ec7cdde4dd3679c0e471455ea57db86aab77.zip | |
Template argument deduction for function types.
llvm-svn: 73070
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 812b319804d..db7e622f7f6 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/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; } |

