File tree Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Original file line number Diff line number Diff line change @@ -482,14 +482,20 @@ DeduceTemplateArguments(Sema &S,
482
482
483
483
// T *
484
484
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 {
487
492
return Sema::TDK_NonDeducedMismatch;
493
+ }
488
494
489
495
unsigned SubTDF = TDF & (TDF_IgnoreQualifiers | TDF_DerivedClass);
490
496
return DeduceTemplateArguments (S, TemplateParams,
491
497
cast<PointerType>(Param)->getPointeeType (),
492
- PointerArg-> getPointeeType () ,
498
+ PointeeType ,
493
499
Info, Deduced, SubTDF);
494
500
}
495
501
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments