forked from OSchip/llvm-project
When performing the deduced/actual argument type check for C++
[temp.deduct.call]p4 under Objective-C++ ARC, make sure to adjust the qualifiers to introduce the implicit strong lifetime when needed. Fixes <rdar://problem/11825671>. llvm-svn: 160412
This commit is contained in:
parent
2151497dca
commit
a906ad2f9e
|
@ -2436,6 +2436,16 @@ CheckOriginalCallArgDeduction(Sema &S, Sema::OriginalCallArg OriginalArg,
|
|||
|
||||
Qualifiers AQuals = A.getQualifiers();
|
||||
Qualifiers DeducedAQuals = DeducedA.getQualifiers();
|
||||
|
||||
// Under Objective-C++ ARC, the deduced type may have implicitly been
|
||||
// given strong lifetime. If so, update the original qualifiers to
|
||||
// include this strong lifetime.
|
||||
if (S.getLangOpts().ObjCAutoRefCount &&
|
||||
DeducedAQuals.getObjCLifetime() == Qualifiers::OCL_Strong &&
|
||||
AQuals.getObjCLifetime() == Qualifiers::OCL_None) {
|
||||
AQuals.setObjCLifetime(Qualifiers::OCL_Strong);
|
||||
}
|
||||
|
||||
if (AQuals == DeducedAQuals) {
|
||||
// Qualifiers match; there's nothing to do.
|
||||
} else if (!DeducedAQuals.compatiblyIncludes(AQuals)) {
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
@interface A
|
||||
@end
|
||||
|
||||
@class NSString;
|
||||
|
||||
template<typename T, typename U>
|
||||
struct is_same {
|
||||
static const bool value = false;
|
||||
|
@ -266,3 +268,18 @@ namespace rdar9828157 {
|
|||
float &fr = (f)(ap);
|
||||
}
|
||||
}
|
||||
|
||||
namespace rdar10862386 {
|
||||
// More deduction with lifetime qualifiers.
|
||||
template <typename T>
|
||||
int testing(const T &) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void test() {
|
||||
testing(1);
|
||||
testing("hi");
|
||||
testing<NSString *>(@"hi");
|
||||
testing(@"hi");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue