forked from OSchip/llvm-project
Fix for PR4285: allow intializing a const wchar_t array with a wide
string. llvm-svn: 72663
This commit is contained in:
parent
2373c599b5
commit
42a8465518
|
@ -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;
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue