Author: Erik Pilkington Date: 2020-10-15T15:21:01-04:00 New Revision: 351317167e2b28aad03f8e45e0ed0acbbff18c61
URL: https://github.com/llvm/llvm-project/commit/351317167e2b28aad03f8e45e0ed0acbbff18c61 DIFF: https://github.com/llvm/llvm-project/commit/351317167e2b28aad03f8e45e0ed0acbbff18c61.diff LOG: [SemaObjC] Fix composite pointer type calculation for `void*` and pointer to lifetime qualified ObjC pointer type Fixes a regression introduced in 9a6f4d451ca7. rdar://70101809 Differential revision: https://reviews.llvm.org/D89475 Added: Modified: clang/lib/Sema/SemaExprCXX.cpp clang/test/SemaObjCXX/arc-ptr-comparison.mm Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 8d5dccc19726..b96649597274 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -6552,12 +6552,16 @@ QualType Sema::FindCompositePointerType(SourceLocation Loc, // FIXME: In C, we merge __strong and none to __strong at the top level. if (Q1.getObjCGCAttr() == Q2.getObjCGCAttr()) Quals.setObjCGCAttr(Q1.getObjCGCAttr()); + else if (T1->isVoidPointerType() || T2->isVoidPointerType()) + assert(Steps.size() == 1); else return QualType(); // Mismatched lifetime qualifiers never compatibly include each other. if (Q1.getObjCLifetime() == Q2.getObjCLifetime()) Quals.setObjCLifetime(Q1.getObjCLifetime()); + else if (T1->isVoidPointerType() || T2->isVoidPointerType()) + assert(Steps.size() == 1); else return QualType(); diff --git a/clang/test/SemaObjCXX/arc-ptr-comparison.mm b/clang/test/SemaObjCXX/arc-ptr-comparison.mm index b3af26c1f847..0ea66c6643bd 100644 --- a/clang/test/SemaObjCXX/arc-ptr-comparison.mm +++ b/clang/test/SemaObjCXX/arc-ptr-comparison.mm @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -verify %s +// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-runtime-has-weak -fobjc-arc -verify %s // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin11 -fsyntax-only -verify -DNOARC %s #ifdef NOARC // expected-no-diagnostics @@ -51,3 +51,17 @@ int testMixedQualComparisonRules(void *v, const void *cv, A *a, const A *ca) { return a == cv; return ca == v; } + +#ifndef NOARC +int testDoublePtr(void *pv, void **ppv, A *__strong* pspa, A *__weak* pwpa, A *__strong** ppspa) { + return pv == pspa; + return pspa == pv; + return pv == pspa; + return pv == pwpa; + return pspa == pwpa; // expected-error {{comparison of distinct pointer types}} + return ppv == pspa; // expected-error {{comparison of distinct pointer types}} + return pspa == ppv; // expected-error {{comparison of distinct pointer types}} + return pv == ppspa; + return ppv == ppspa; // expected-error{{comparison of distinct pointer types}} +} +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits