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

Reply via email to