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:
Douglas Gregor 2012-07-18 00:14:59 +00:00
parent 2151497dca
commit a906ad2f9e
2 changed files with 27 additions and 0 deletions

View File

@ -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)) {

View File

@ -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");
}
}