Fix for PR4285: allow intializing a const wchar_t array with a wide

string.

llvm-svn: 72663
This commit is contained in:
Eli Friedman 2009-05-31 10:54:53 +00:00
parent 2373c599b5
commit 42a8465518
2 changed files with 13 additions and 7 deletions

View File

@ -44,17 +44,19 @@ static Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) {
// Otherwise we can only handle string literals.
StringLiteral *SL = dyn_cast<StringLiteral>(Init);
if (SL == 0) return 0;
QualType ElemTy = Context.getCanonicalType(AT->getElementType());
// 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;
return ElemTy->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.getWCharType(), AT->getElementType()))
// Only allow wchar_t x[] = L"foo"; not wchar_t x[] = "foo";
// wchar_t array can be initialized with a wide string: C99 6.7.8p15 (with
// correction from DR343): "An array with element type compatible with a
// qualified or unqualified version of wchar_t may be initialized by a wide
// string literal, optionally enclosed in braces."
if (Context.typesAreCompatible(Context.getWCharType(),
ElemTy.getUnqualifiedType()))
return Init;
return 0;

View File

@ -1,5 +1,6 @@
// RUN: clang-cc %s -verify -fsyntax-only
#include <stddef.h>
#include <stdint.h>
typedef void (* fp)(void);
@ -122,3 +123,6 @@ ivector4 vtest4 = __imag__ (ivector4){1};
uintptr_t ptrasintadd1 = (uintptr_t)&a - 4;
uintptr_t ptrasintadd2 = (uintptr_t)&a + 4;
uintptr_t ptrasintadd3 = 4 + (uintptr_t)&a;
// PR4285
const wchar_t widestr[] = L"asdf";