Hi,
I have made some improvements on the string plus char warning.
It can now also handle arrays, struct members and return values from function
calls.
e.q
ab->a + 'b';
foo() + 'c';
char *strArr2[] = {"ac","dc"};
str = strArr2[0] + 'c';
//Anders
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp (revision 206444)
+++ lib/Sema/SemaExpr.cpp (working copy)
@@ -7092,13 +7092,13 @@
/// \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)
@@ -7106,14 +7106,21 @@
const QualType StringType = StringRefExpr->getType();
- // Return if not a PointerType.
- if (!StringType->isAnyPointerType())
+ // Return if neither PointerType or ConstantArrayType.
+ if (!StringType->isAnyPointerType() &&
+ !StringType->isConstantArrayType())
return;
- // Return if not a CharacterType.
- if (!StringType->getPointeeType()->isAnyCharacterType())
+ // Return if pointerType but not a CharacterType.
+ if (StringType->isAnyPointerType() &&
+ !StringType->getPointeeType()->isAnyCharacterType())
return;
+ // Return if ConstantArrayType but not a CharacterType.
+ if (StringType->isConstantArrayType() &&
+ !StringType->getArrayElementTypeNoTypeQual()->isAnyCharacterType())
+ return;
+
ASTContext &Ctx = Self.getASTContext();
SourceRange DiagRange(LHSExpr->getLocStart(), RHSExpr->getLocEnd());
Index: test/Sema/string-plus-char.c
===================================================================
--- test/Sema/string-plus-char.c (revision 206444)
+++ test/Sema/string-plus-char.c (working copy)
@@ -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 @@
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;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits