forked from OSchip/llvm-project
Remove a dead argument to ProcessUCNEscape.
Fix string concatenation to treat escapes in concatenated strings that are wide because of other string chunks to process the escapes as wide themselves. Before we would warn about and miscompile the attached testcase. This fixes rdar://8040728 - miscompile + warning: hex escape sequence out of range llvm-svn: 106012
This commit is contained in:
parent
a8687ae490
commit
c548be9ab3
|
@ -169,9 +169,8 @@ static unsigned ProcessCharEscape(const char *&ThisTokBuf,
|
||||||
/// we will likely rework our support for UCN's.
|
/// we will likely rework our support for UCN's.
|
||||||
static void ProcessUCNEscape(const char *&ThisTokBuf, const char *ThisTokEnd,
|
static void ProcessUCNEscape(const char *&ThisTokBuf, const char *ThisTokEnd,
|
||||||
char *&ResultBuf, bool &HadError,
|
char *&ResultBuf, bool &HadError,
|
||||||
SourceLocation Loc, bool IsWide, Preprocessor &PP,
|
SourceLocation Loc, Preprocessor &PP,
|
||||||
bool Complain)
|
bool Complain) {
|
||||||
{
|
|
||||||
// FIXME: Add a warning - UCN's are only valid in C++ & C99.
|
// FIXME: Add a warning - UCN's are only valid in C++ & C99.
|
||||||
// FIXME: Handle wide strings.
|
// FIXME: Handle wide strings.
|
||||||
|
|
||||||
|
@ -835,11 +834,8 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
|
||||||
// TODO: Input character set mapping support.
|
// TODO: Input character set mapping support.
|
||||||
|
|
||||||
// Skip L marker for wide strings.
|
// Skip L marker for wide strings.
|
||||||
bool ThisIsWide = false;
|
if (ThisTokBuf[0] == 'L')
|
||||||
if (ThisTokBuf[0] == 'L') {
|
|
||||||
++ThisTokBuf;
|
++ThisTokBuf;
|
||||||
ThisIsWide = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(ThisTokBuf[0] == '"' && "Expected quote, lexer broken?");
|
assert(ThisTokBuf[0] == '"' && "Expected quote, lexer broken?");
|
||||||
++ThisTokBuf;
|
++ThisTokBuf;
|
||||||
|
@ -884,14 +880,13 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
|
||||||
// Is this a Universal Character Name escape?
|
// Is this a Universal Character Name escape?
|
||||||
if (ThisTokBuf[1] == 'u' || ThisTokBuf[1] == 'U') {
|
if (ThisTokBuf[1] == 'u' || ThisTokBuf[1] == 'U') {
|
||||||
ProcessUCNEscape(ThisTokBuf, ThisTokEnd, ResultPtr,
|
ProcessUCNEscape(ThisTokBuf, ThisTokEnd, ResultPtr,
|
||||||
hadError, StringToks[i].getLocation(), ThisIsWide, PP,
|
hadError, StringToks[i].getLocation(), PP, Complain);
|
||||||
Complain);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Otherwise, this is a non-UCN escape character. Process it.
|
// Otherwise, this is a non-UCN escape character. Process it.
|
||||||
unsigned ResultChar = ProcessCharEscape(ThisTokBuf, ThisTokEnd, hadError,
|
unsigned ResultChar = ProcessCharEscape(ThisTokBuf, ThisTokEnd, hadError,
|
||||||
StringToks[i].getLocation(),
|
StringToks[i].getLocation(),
|
||||||
ThisIsWide, PP, Complain);
|
AnyWide, PP, Complain);
|
||||||
|
|
||||||
// Note: our internal rep of wide char tokens is always little-endian.
|
// Note: our internal rep of wide char tokens is always little-endian.
|
||||||
*ResultPtr++ = ResultChar & 0xFF;
|
*ResultPtr++ = ResultChar & 0xFF;
|
||||||
|
|
|
@ -25,3 +25,8 @@ int t(void) {
|
||||||
basic_string<wchar_t>() + L'-';
|
basic_string<wchar_t>() + L'-';
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// rdar://8040728
|
||||||
|
wchar_t in[] = L"\x434" "\x434"; // No warning
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue