diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-04-16 23:44:05 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-04-16 23:44:05 +0000 |
| commit | 1cf5bdd03d7e1a77818dda4c4dea8f33a6f2e006 (patch) | |
| tree | 4a320d1c9d46d03fc733606815a49ee48be6ecb6 | |
| parent | 7258dcd77f19bf5adb5f76d4c2bb5fc426ba75c2 (diff) | |
| download | bcm5719-llvm-1cf5bdd03d7e1a77818dda4c4dea8f33a6f2e006.tar.gz bcm5719-llvm-1cf5bdd03d7e1a77818dda4c4dea8f33a6f2e006.zip | |
emit warn_char_constant_too_large at most once per literal, fixing PR6852
llvm-svn: 101580
| -rw-r--r-- | clang/lib/Lex/LiteralSupport.cpp | 5 | ||||
| -rw-r--r-- | clang/test/Preprocessor/if_warning.c | 6 |
2 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 1cfa0e37450..f4255822641 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -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; } } diff --git a/clang/test/Preprocessor/if_warning.c b/clang/test/Preprocessor/if_warning.c index 98653a8feef..345ac95eb4b 100644 --- a/clang/test/Preprocessor/if_warning.c +++ b/clang/test/Preprocessor/if_warning.c @@ -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 |

