diff options
author | Richard Smith <richard@metafoo.co.uk> | 2020-01-09 19:22:52 -0800 |
---|---|---|
committer | Richard Smith <richard@metafoo.co.uk> | 2020-01-10 16:12:00 -0800 |
commit | fbf915f01d46e005146f01553a5d7c6619d19597 (patch) | |
tree | c557a3cc30177285335f34c21fe006a56a7e2792 /clang/test/SemaObjCXX | |
parent | f4df7f4701d80ce6a2f5674db50f87fbd2dad82f (diff) | |
download | bcm5719-llvm-fbf915f01d46e005146f01553a5d7c6619d19597.tar.gz bcm5719-llvm-fbf915f01d46e005146f01553a5d7c6619d19597.zip |
Add a FIXME and corresponding test coverage for some suspicious behavior
forming composite ObjC pointer types in comparisons.
Diffstat (limited to 'clang/test/SemaObjCXX')
-rw-r--r-- | clang/test/SemaObjCXX/arc-ptr-comparison.mm | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/test/SemaObjCXX/arc-ptr-comparison.mm b/clang/test/SemaObjCXX/arc-ptr-comparison.mm index 8571a817959..b3af26c1f84 100644 --- a/clang/test/SemaObjCXX/arc-ptr-comparison.mm +++ b/clang/test/SemaObjCXX/arc-ptr-comparison.mm @@ -22,3 +22,32 @@ int testObjCComparisonRules(void *v, id x, id y) { return v == (void *)0; return x == y; } + +@class A; + +int testMixedQualComparisonRules(void *v, const void *cv, A *a, const A *ca) { + return cv == ca; +#ifndef NOARC +// expected-error@-2 {{implicit conversion of Objective-C pointer type 'const A *' to C pointer type 'const void *' requires a bridged cast}} +// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}} +// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'const void *'}} +#endif + // FIXME: The "to" type in this diagnostic is wrong; we should convert to "const void *". + return v == ca; +#ifndef NOARC +// expected-error@-2 {{implicit conversion of Objective-C pointer type 'const A *' to C pointer type 'void *' requires a bridged cast}} +// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}} +// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'void *'}} +#endif + return cv == a; +#ifndef NOARC +// expected-error@-2 {{implicit conversion of Objective-C pointer type 'A *' to C pointer type 'const void *' requires a bridged cast}} +// expected-note@-3 {{use __bridge to convert directly (no change in ownership)}} +// expected-note@-4 {{use __bridge_retained to make an ARC object available as a +1 'const void *'}} +#endif + + // FIXME: Shouldn't these be rejected in ARC mode too? + return ca == cv; + return a == cv; + return ca == v; +} |