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