forked from OSchip/llvm-project
objective-c++: Type of an objc string literal is NSString, not 'id'.
// rdar://10907410 llvm-svn: 151296
This commit is contained in:
parent
0c84ebb539
commit
86f8266b9f
|
@ -218,6 +218,8 @@ class ASTContext : public RefCountedBase<ASTContext> {
|
|||
|
||||
QualType ObjCConstantStringType;
|
||||
mutable RecordDecl *CFConstantStringTypeDecl;
|
||||
|
||||
QualType ObjCNSStringType;
|
||||
|
||||
/// \brief The typedef declaration for the Objective-C "instancetype" type.
|
||||
TypedefDecl *ObjCInstanceTypeDecl;
|
||||
|
@ -944,6 +946,14 @@ public:
|
|||
return ObjCConstantStringType;
|
||||
}
|
||||
|
||||
QualType getObjCNSStringType() const {
|
||||
return ObjCNSStringType;
|
||||
}
|
||||
|
||||
void setObjCNSStringType(QualType T) {
|
||||
ObjCNSStringType = T;
|
||||
}
|
||||
|
||||
/// \brief Retrieve the type that 'id' has been defined to, which may be
|
||||
/// different from the built-in 'id' if 'id' has been typedef'd.
|
||||
QualType getObjCIdRedefinitionType() const {
|
||||
|
|
|
@ -113,9 +113,21 @@ ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,
|
|||
Ty = Context.getObjCConstantStringInterface();
|
||||
Ty = Context.getObjCObjectPointerType(Ty);
|
||||
} else {
|
||||
// If there is no NSString interface defined then treat constant
|
||||
// strings as untyped objects and let the runtime figure it out later.
|
||||
Ty = Context.getObjCIdType();
|
||||
// If there is no NSString interface defined, implicitly declare
|
||||
// a @class NSString; and use that instead. This is to make sure
|
||||
// type of an NSString literal is represented correctly, instead of
|
||||
// being an 'id' type.
|
||||
Ty = Context.getObjCNSStringType();
|
||||
if (Ty.isNull()) {
|
||||
ObjCInterfaceDecl *NSStringIDecl =
|
||||
ObjCInterfaceDecl::Create (Context,
|
||||
Context.getTranslationUnitDecl(),
|
||||
SourceLocation(), NSIdent,
|
||||
0, SourceLocation());
|
||||
Ty = Context.getObjCInterfaceType(NSStringIDecl);
|
||||
Context.setObjCNSStringType(Ty);
|
||||
}
|
||||
Ty = Context.getObjCObjectPointerType(Ty);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ void createFoo4() {
|
|||
}
|
||||
|
||||
void createFoo5() {
|
||||
MyClass *obj = @"";
|
||||
MyClass *obj = (id)@"";
|
||||
|
||||
double d = [obj doubleM]; // no-warning
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
// RUN: %clang_cc1 -fblocks -include-pch %t -fsyntax-only -verify %s
|
||||
|
||||
// Expressions
|
||||
int *A1 = (objc_string)0; // expected-warning {{aka 'id'}}
|
||||
int *A1 = (objc_string)0; // expected-warning {{aka 'NSString *'}}
|
||||
|
||||
char A2 = (objc_encode){}; // expected-error {{not a compile-time constant}} \
|
||||
expected-warning {{char [2]}}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fblocks -fsyntax-only -verify %s
|
||||
// rdar://10907410
|
||||
|
||||
void test(id pid, Class pclass) {
|
||||
void (^block)(void) = @"help"; // expected-error {{initializing 'void (^)(void)' with an expression of incompatible type 'NSString *'}}
|
||||
void (^block1)(void) = pid;
|
||||
void (^block2)(void) = @"help"; // expected-error {{initializing 'void (^)(void)' with an expression of incompatible type 'NSString *'}}
|
||||
void (^block3)(void) = @"help"; // expected-error {{initializing 'void (^)(void)' with an expression of incompatible type 'NSString *'}}
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fblocks -fsyntax-only -verify %s
|
||||
// rdar://10907410
|
||||
|
||||
void test(id pid, Class pclass) {
|
||||
void (^block)(void) = @"help"; // expected-error {{cannot initialize a variable of type 'void (^)()' with an rvalue of type 'NSString *'}}
|
||||
void (^block1)(void) = pid;
|
||||
void (^block2)(void) = @"help"; // expected-error {{cannot initialize a variable of type 'void (^)()' with an rvalue of type 'NSString *'}}
|
||||
void (^block3)(void) = @"help"; // expected-error {{cannot initialize a variable of type 'void (^)()' with an rvalue of type 'NSString *'}}
|
||||
}
|
||||
|
Loading…
Reference in New Issue