Skip to content

Commit bb4ea81

Browse files
committed
When performing template argument deduction, match Objective C pointers
against pointer patterns. llvm-svn: 103706
1 parent 7100860 commit bb4ea81

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,14 +482,20 @@ DeduceTemplateArguments(Sema &S,
482482

483483
// T *
484484
case Type::Pointer: {
485-
const PointerType *PointerArg = Arg->getAs<PointerType>();
486-
if (!PointerArg)
485+
QualType PointeeType;
486+
if (const PointerType *PointerArg = Arg->getAs<PointerType>()) {
487+
PointeeType = PointerArg->getPointeeType();
488+
} else if (const ObjCObjectPointerType *PointerArg
489+
= Arg->getAs<ObjCObjectPointerType>()) {
490+
PointeeType = PointerArg->getPointeeType();
491+
} else {
487492
return Sema::TDK_NonDeducedMismatch;
493+
}
488494

489495
unsigned SubTDF = TDF & (TDF_IgnoreQualifiers | TDF_DerivedClass);
490496
return DeduceTemplateArguments(S, TemplateParams,
491497
cast<PointerType>(Param)->getPointeeType(),
492-
PointerArg->getPointeeType(),
498+
PointeeType,
493499
Info, Deduced, SubTDF);
494500
}
495501

clang/test/SemaObjCXX/deduction.mm

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %clang_cc1 -fsyntax-only -verify %s
2+
3+
@class NSString;
4+
5+
// Reduced from WebKit.
6+
namespace test0 {
7+
template <typename T> struct RemovePointer {
8+
typedef T Type;
9+
};
10+
11+
template <typename T> struct RemovePointer<T*> {
12+
typedef T Type;
13+
};
14+
15+
template <typename T> struct RetainPtr {
16+
typedef typename RemovePointer<T>::Type ValueType;
17+
typedef ValueType* PtrType;
18+
RetainPtr(PtrType ptr);
19+
};
20+
21+
void test(NSString *S) {
22+
RetainPtr<NSString*> ptr(S);
23+
}
24+
}

0 commit comments

Comments
 (0)