diff options
| author | Douglas Gregor <dgregor@apple.com> | 2013-01-17 23:59:28 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2013-01-17 23:59:28 +0000 |
| commit | f4e43315a96842d820262f513c5aba3b0e4a538b (patch) | |
| tree | ce61943d6e912d253bbabaab3071cc3d46efa8e7 | |
| parent | 5011a0022a4d693870fd3198f464451dec0bc653 (diff) | |
| download | bcm5719-llvm-f4e43315a96842d820262f513c5aba3b0e4a538b.tar.gz bcm5719-llvm-f4e43315a96842d820262f513c5aba3b0e4a538b.zip | |
One can override an Objective-C ARC ownership qualifier that came from
a template parameter; make that also include one that came from
'auto'. Fixes <rdar://problem/12078752>.
llvm-svn: 172770
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 10 | ||||
| -rw-r--r-- | clang/test/SemaObjCXX/arc-0x.mm | 8 |
2 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 2091cffc83b..bacf6d5d9b4 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -3365,6 +3365,7 @@ TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, // Objective-C ARC: // A lifetime qualifier applied to a substituted template parameter // overrides the lifetime qualifier from the template argument. + const AutoType *AutoTy; if (const SubstTemplateTypeParmType *SubstTypeParam = dyn_cast<SubstTemplateTypeParmType>(Result)) { QualType Replacement = SubstTypeParam->getReplacementType(); @@ -3377,6 +3378,15 @@ TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, SubstTypeParam->getReplacedParameter(), Replacement); TLB.TypeWasModifiedSafely(Result); + } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) { + // 'auto' types behave the same way as template parameters. + QualType Deduced = AutoTy->getDeducedType(); + Qualifiers Qs = Deduced.getQualifiers(); + Qs.removeObjCLifetime(); + Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), + Qs); + Result = SemaRef.Context.getAutoType(Deduced); + TLB.TypeWasModifiedSafely(Result); } else { // Otherwise, complain about the addition of a qualifier to an // already-qualified type. diff --git a/clang/test/SemaObjCXX/arc-0x.mm b/clang/test/SemaObjCXX/arc-0x.mm index 43f6671ac24..391fc47f342 100644 --- a/clang/test/SemaObjCXX/arc-0x.mm +++ b/clang/test/SemaObjCXX/arc-0x.mm @@ -93,3 +93,11 @@ typedef __builtin_va_list va_list; __builtin_va_arg(args, id); } @end + +namespace rdar12078752 { + void f() { + NSObject* o =0; + __autoreleasing decltype(o) o2 = o; + __autoreleasing auto o3 = o; + } +} |

