[Sema][ObjC] Fix spurious -Wcast-qual warnings.
We do not meaningfully track object const-ness of Objective-C object types. Silence the -Wcast-qual warning that is issued when casting to or from Objective-C object types results in losing const qualification. rdar://problem/33807915 llvm-svn: 310672
This commit is contained in:
parent
6315d2d21d
commit
8d7bdf6dff
|
@ -552,7 +552,14 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType,
|
|||
Qualifiers SrcQuals, DestQuals;
|
||||
Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
|
||||
Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
|
||||
|
||||
|
||||
// We do not meaningfully track object const-ness of Objective-C object
|
||||
// types. Remove const from the source type if either the source or
|
||||
// the destination is an Objective-C object type.
|
||||
if (UnwrappedSrcType->isObjCObjectType() ||
|
||||
UnwrappedDestType->isObjCObjectType())
|
||||
SrcQuals.removeConst();
|
||||
|
||||
Qualifiers RetainedSrcQuals, RetainedDestQuals;
|
||||
if (CheckCVR) {
|
||||
RetainedSrcQuals.setCVRQualifiers(SrcQuals.getCVRQualifiers());
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fblocks -verify %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fblocks -Wcast-qual -verify %s
|
||||
// rdar://10597832
|
||||
|
||||
typedef const void *CFTypeRef;
|
||||
typedef const struct __CFString *CFStringRef;
|
||||
@class NSString;
|
||||
|
||||
@interface NSString
|
||||
@end
|
||||
|
@ -18,7 +19,7 @@ NSString *CreateNSString();
|
|||
void from_cf() {
|
||||
id obj1 = (__bridge_transfer id)CFCreateSomething(); // expected-warning {{'__bridge_transfer' casts have no effect when not using ARC}}
|
||||
id obj2 = (__bridge_transfer NSString*)CFCreateString(); // expected-warning {{'__bridge_transfer' casts have no effect when not using ARC}}
|
||||
(__bridge int*)CFCreateSomething(); // expected-warning {{expression result unused}}
|
||||
(__bridge int*)CFCreateSomething(); // expected-warning {{expression result unused}} expected-warning {{cast from 'const void *' to 'int *' drops const qualifier}}
|
||||
id obj3 = (__bridge id)CFGetSomething();
|
||||
id obj4 = (__bridge NSString*)CFGetString();
|
||||
}
|
||||
|
@ -41,3 +42,15 @@ void to_cf_ignored(id obj) {
|
|||
CFTypeRef cf1 = (__bridge_retained CFTypeRef)CreateSomething(); // no-warning
|
||||
CFTypeRef cf3 = (__bridge CFTypeRef)CreateSomething(); // no-warning
|
||||
}
|
||||
|
||||
// Check that clang doesn't warn about dropping const from Objective-C object
|
||||
// types.
|
||||
void test_wcast_qual() {
|
||||
CFStringRef c;
|
||||
NSString *n0 = (NSString *)c;
|
||||
NSString **n1 = (NSString **)&c;
|
||||
const NSString *n2;
|
||||
const NSString **n3;
|
||||
void *p0 = (void *)n2;
|
||||
void **p1 = (void **)n3;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue