Your right. I think it's a left over from when i first tried to cast it to an 
arraysubscriptexpr.

Here is a new patch with array type removed.

//Anders
________________________________________
Från: Jordan Rose [[email protected]]
Skickat: den 24 april 2014 18:43
Till: Anders Rönnholm
Cc: [email protected]
Ämne: Re: [PATCH] String plus char

If we're not looking through implicit casts, when would there ever be a case 
when the StringRefExpr is a constant array type? Shouldn't it always decay to a 
pointer?

Jordan


On Apr 17, 2014, at 5:19 , Anders Rönnholm <[email protected]> wrote:

> 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
> <stringpluschar.diff>_______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

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)
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