diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-04-12 17:49:18 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-04-12 17:49:18 +0000 |
commit | 30c3de97a93609ce6cba3ee2f160dedc7d9d77d9 (patch) | |
tree | d0c42de16d3946049dedfb362c81aa976c3b0d38 | |
parent | 6f3e5ad704a5c0e662882b42f13968d89c5ff19d (diff) | |
download | bcm5719-llvm-30c3de97a93609ce6cba3ee2f160dedc7d9d77d9.tar.gz bcm5719-llvm-30c3de97a93609ce6cba3ee2f160dedc7d9d77d9.zip |
objective-c numeric literal: type of boolean is
that of typedef BOOL if found.
// rdar://11231426
llvm-svn: 154595
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 14 | ||||
-rw-r--r-- | clang/test/Rewriter/objc-bool-literal-modern-1.mm | 31 | ||||
-rw-r--r-- | clang/test/SemaObjCXX/literals.mm | 11 |
3 files changed, 54 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 1711f356c62..7748b8c8a66 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -11259,6 +11259,18 @@ ExprResult Sema::ActOnObjCBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind) { assert((Kind == tok::kw___objc_yes || Kind == tok::kw___objc_no) && "Unknown Objective-C Boolean value!"); + QualType ObjCBoolLiteralQT = Context.ObjCBuiltinBoolTy; + // signed char is the default type for boolean literals. Use 'BOOL' + // instead, if BOOL typedef is visible in its scope instead. + Decl *TD = + LookupSingleName(TUScope, &Context.Idents.get("BOOL"), + SourceLocation(), LookupOrdinaryName); + if (TypeDecl *BoolTD = dyn_cast_or_null<TypeDecl>(TD)) { + QualType QT = QualType(BoolTD->getTypeForDecl(), 0); + if (!QT.isNull()) + ObjCBoolLiteralQT = QT; + } + return Owned(new (Context) ObjCBoolLiteralExpr(Kind == tok::kw___objc_yes, - Context.ObjCBuiltinBoolTy, OpLoc)); + ObjCBoolLiteralQT, OpLoc)); } diff --git a/clang/test/Rewriter/objc-bool-literal-modern-1.mm b/clang/test/Rewriter/objc-bool-literal-modern-1.mm new file mode 100644 index 00000000000..782517242e5 --- /dev/null +++ b/clang/test/Rewriter/objc-bool-literal-modern-1.mm @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp +// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"__declspec(X)=" %t-rw.cpp +// rdar://11231426 + +typedef bool BOOL; + +BOOL yes() { + return __objc_yes; +} + +BOOL no() { + return __objc_no; +} + +BOOL which (int flag) { + return flag ? yes() : no(); +} + +int main() { + which (__objc_yes); + which (__objc_no); + return __objc_yes; +} + +void y(BOOL (^foo)()); + +void x() { + y(^{ + return __objc_yes; + }); +} diff --git a/clang/test/SemaObjCXX/literals.mm b/clang/test/SemaObjCXX/literals.mm index 1f6782abbec..eed67652d2a 100644 --- a/clang/test/SemaObjCXX/literals.mm +++ b/clang/test/SemaObjCXX/literals.mm @@ -1,6 +1,15 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x -fblocks %s -typedef unsigned char BOOL; +// rdar://11231426 +typedef bool BOOL; + +void y(BOOL (^foo)()); + +void x() { + y(^{ + return __objc_yes; + }); +} @protocol NSCopying - copy; |