emit warn_char_constant_too_large at most once per literal, fixing PR6852

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101580 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-04-16 23:44:05 +00:00
Родитель 2b334bb312
Коммит 1c6c64b518
2 изменённых файлов: 10 добавлений и 1 удалений

Просмотреть файл

@ -654,6 +654,7 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
llvm::APInt LitVal(PP.getTargetInfo().getIntWidth(), 0);
unsigned NumCharsSoFar = 0;
bool Warned = false;
while (begin[0] != '\'') {
uint64_t ResultChar;
if (begin[0] != '\\') // If this is a normal character, consume it.
@ -670,8 +671,10 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
} else {
// Narrow character literals act as though their value is concatenated
// in this implementation, but warn on overflow.
if (LitVal.countLeadingZeros() < 8)
if (LitVal.countLeadingZeros() < 8 && !Warned) {
PP.Diag(Loc, diag::warn_char_constant_too_large);
Warned = true;
}
LitVal <<= 8;
}
}

Просмотреть файл

@ -19,3 +19,9 @@ extern int x;
#else 1 // Should not warn due to C99 6.10p4
#endif
#endif
// PR6852
#if 'somesillylongthing' // expected-warning {{character constant too long for its type}} \
// expected-warning {{multi-character character constant}}
#endif