diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-06-04 00:21:18 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-06-04 00:21:18 +0000 |
commit | d560d5025a0e5b1942d99d5f39005337b03a64c2 (patch) | |
tree | 833dd9cbf4b36f3ecbdcd3aa2b92fb12d59e0765 /lib/Sema/SemaTemplateDeduction.cpp | |
parent | 33412927aea33539b4e92df381e2fb071d4d9bb9 (diff) |
Template argument deduction for references
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72822 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateDeduction.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index a55dadd932..c989132391 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -66,15 +66,42 @@ static bool DeduceTemplateArguments(ASTContext &Context, QualType Param, if (Param.getCVRQualifiers() != Arg.getCVRQualifiers()) return false; - if (const PointerType *PointerParam = Param->getAsPointerType()) { - const PointerType *PointerArg = Arg->getAsPointerType(); - if (!PointerArg) - return false; + switch (Param->getTypeClass()) { + case Type::Pointer: { + const PointerType *PointerArg = Arg->getAsPointerType(); + if (!PointerArg) + return false; + + return DeduceTemplateArguments(Context, + cast<PointerType>(Param)->getPointeeType(), + PointerArg->getPointeeType(), + Deduced); + } + + case Type::LValueReference: { + const LValueReferenceType *ReferenceArg = Arg->getAsLValueReferenceType(); + if (!ReferenceArg) + return false; + + return DeduceTemplateArguments(Context, + cast<LValueReferenceType>(Param)->getPointeeType(), + ReferenceArg->getPointeeType(), + Deduced); + } - return DeduceTemplateArguments(Context, - PointerParam->getPointeeType(), - PointerArg->getPointeeType(), - Deduced); + case Type::RValueReference: { + const RValueReferenceType *ReferenceArg = Arg->getAsRValueReferenceType(); + if (!ReferenceArg) + return false; + + return DeduceTemplateArguments(Context, + cast<RValueReferenceType>(Param)->getPointeeType(), + ReferenceArg->getPointeeType(), + Deduced); + } + + default: + break; } // FIXME: Many more cases to go (to go). |