summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-02-26 23:26:43 +0000
committerChris Lattner <sabre@nondot.org>2009-02-26 23:26:43 +0000
commita9196810b3fb90600e8bb2fae5839323187ba153 (patch)
tree15afe2b80f3cab5fcaee69342d0c4bb15b38749a /clang/lib
parent1b44ba42959c0c201de5db9b217bb1ede2b133be (diff)
downloadbcm5719-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.cpp31
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;
}
OpenPOWER on IntegriCloud