[cfe-commits] r72822 - in /cfe/trunk: lib/AST/Type.cpp lib/Sema/SemaTemplateDeduction.cpp test/SemaTemplate/temp_class_spec.cpp
Douglas Gregor
dgregor at apple.com
Wed Jun 3 17:21:23 PDT 2009
Author: dgregor
Date: Wed Jun 3 19:21:18 2009
New Revision: 72822
URL: http://llvm.org/viewvc/llvm-project?rev=72822&view=rev
Log:
Template argument deduction for references
Modified:
cfe/trunk/lib/AST/Type.cpp
cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
cfe/trunk/test/SemaTemplate/temp_class_spec.cpp
Modified: cfe/trunk/lib/AST/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=72822&r1=72821&r2=72822&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Type.cpp (original)
+++ cfe/trunk/lib/AST/Type.cpp Wed Jun 3 19:21:18 2009
@@ -1049,6 +1049,10 @@
anyDependentTemplateArguments(const TemplateArgument *Args, unsigned NumArgs) {
for (unsigned Idx = 0; Idx < NumArgs; ++Idx) {
switch (Args[Idx].getKind()) {
+ case TemplateArgument::Null:
+ assert(false && "Should not have a NULL template argument");
+ break;
+
case TemplateArgument::Type:
if (Args[Idx].getAsType()->isDependentType())
return true;
Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=72822&r1=72821&r2=72822&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Wed Jun 3 19:21:18 2009
@@ -66,15 +66,42 @@
if (Param.getCVRQualifiers() != Arg.getCVRQualifiers())
return false;
- if (const PointerType *PointerParam = Param->getAsPointerType()) {
- const PointerType *PointerArg = Arg->getAsPointerType();
- if (!PointerArg)
- return false;
-
- return DeduceTemplateArguments(Context,
- PointerParam->getPointeeType(),
- PointerArg->getPointeeType(),
- Deduced);
+ 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);
+ }
+
+ 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).
Modified: cfe/trunk/test/SemaTemplate/temp_class_spec.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_class_spec.cpp?rev=72822&r1=72821&r2=72822&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/temp_class_spec.cpp (original)
+++ cfe/trunk/test/SemaTemplate/temp_class_spec.cpp Wed Jun 3 19:21:18 2009
@@ -19,6 +19,19 @@
int array2[is_pointer<const int*>::value? 1 : -1]; // expected-error{{partial ordering}} \
// expected-error{{negative}}
+template<typename T>
+struct is_lvalue_reference {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_lvalue_reference<T&> {
+ static const bool value = true;
+};
+
+int lvalue_ref0[is_lvalue_reference<int>::value? -1 : 1];
+int lvalue_ref1[is_lvalue_reference<const int&>::value? 1 : -1];
+
template<typename T, typename U>
struct is_same {
static const bool value = false;
More information about the cfe-commits
mailing list