forked from OSchip/llvm-project
Sema: Cleanup and improve string-plus-char checking.
Patch by Anders Rönnholm llvm-svn: 224268
This commit is contained in:
parent
26f884aedf
commit
368590094a
|
@ -7312,13 +7312,13 @@ static void diagnoseStringPlusInt(Sema &Self, SourceLocation OpLoc,
|
|||
/// \brief Emit a warning when adding a char literal to a string.
|
||||
static void diagnoseStringPlusChar(Sema &Self, SourceLocation OpLoc,
|
||||
Expr *LHSExpr, Expr *RHSExpr) {
|
||||
const DeclRefExpr *StringRefExpr =
|
||||
dyn_cast<DeclRefExpr>(LHSExpr->IgnoreImpCasts());
|
||||
const Expr *StringRefExpr = LHSExpr;
|
||||
const CharacterLiteral *CharExpr =
|
||||
dyn_cast<CharacterLiteral>(RHSExpr->IgnoreImpCasts());
|
||||
if (!StringRefExpr) {
|
||||
StringRefExpr = dyn_cast<DeclRefExpr>(RHSExpr->IgnoreImpCasts());
|
||||
|
||||
if (!CharExpr) {
|
||||
CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->IgnoreImpCasts());
|
||||
StringRefExpr = RHSExpr;
|
||||
}
|
||||
|
||||
if (!CharExpr || !StringRefExpr)
|
||||
|
|
|
@ -1,5 +1,11 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
struct AB{const char *a; const char*b;};
|
||||
|
||||
const char *foo(const struct AB *ab) {
|
||||
return ab->a + 'b'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
|
||||
}
|
||||
|
||||
void f(const char *s) {
|
||||
char *str = 0;
|
||||
char *str2 = str + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
|
||||
|
@ -8,6 +14,15 @@ void f(const char *s) {
|
|||
|
||||
str = 'c' + str;// expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
|
||||
|
||||
char strArr[] = "foo";
|
||||
str = strArr + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
|
||||
char *strArr2[] = {"ac","dc"};
|
||||
str = strArr2[0] + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
|
||||
|
||||
|
||||
struct AB ab;
|
||||
constStr = foo(&ab) + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
|
||||
|
||||
// no-warning
|
||||
char c = 'c';
|
||||
str = str + c;
|
||||
|
|
Loading…
Reference in New Issue