diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-26 23:26:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-26 23:26:43 +0000 |
commit | a9196810b3fb90600e8bb2fae5839323187ba153 (patch) | |
tree | 15afe2b80f3cab5fcaee69342d0c4bb15b38749a /clang/lib | |
parent | 1b44ba42959c0c201de5db9b217bb1ede2b133be (diff) | |
download | bcm5719-llvm-a9196810b3fb90600e8bb2fae5839323187ba153.tar.gz bcm5719-llvm-a9196810b3fb90600e8bb2fae5839323187ba153.zip |
allow wide strings to initialize arrays compatible with wchar_t.
Unfortunately this doesn't work yet because wchar_t is completely
broken in C.
llvm-svn: 65585
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index f4c375dfff1..eeda1d05ca3 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -27,12 +27,31 @@ using namespace clang; //===----------------------------------------------------------------------===// static Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) { - if (const ArrayType *AT = Context.getAsArrayType(DeclType)) - if (AT->getElementType()->isCharType()) { - Init = Init->IgnoreParens(); - if (isa<StringLiteral>(Init) || isa<ObjCEncodeExpr>(Init)) - return Init; - } + const ArrayType *AT = Context.getAsArrayType(DeclType); + if (!AT) return 0; + + // See if this is a string literal or @encode. + Init = Init->IgnoreParens(); + + // Handle @encode, which is a narrow string. + if (isa<ObjCEncodeExpr>(Init) && AT->getElementType()->isCharType()) + return Init; + + // Otherwise we can only handle string literals. + StringLiteral *SL = dyn_cast<StringLiteral>(Init); + + // char array can be initialized with a narrow string. + // Only allow char x[] = "foo"; not char x[] = L"foo"; + if (!SL->isWide()) + return AT->getElementType()->isCharType() ? Init : 0; + + // wchar_t array can be initialized with a wide string: C99 6.7.8p15: + // "An array with element type compatible with wchar_t may be initialized by a + // wide string literal, optionally enclosed in braces." + if (Context.typesAreCompatible(Context.WCharTy, AT->getElementType())) + // Only allow wchar_t x[] = L"foo"; not wchar_t x[] = "foo"; + return Init; + return 0; } |