Re: r349054 - Make -Wstring-plus-int warns even if when the result is not out of bounds

2018-12-13 Thread Evgenii Stepanov via cfe-commits
Hi,

this broke Clang :: SemaCXX/constant-expression-cxx1y.cpp:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap-msan/builds/9144

error: 'warning' diagnostics seen but not expected:
  File 
/b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm/tools/clang/test/SemaCXX/constant-expression-cxx1y.cpp
Line 447: adding 'int' to a string does not append to the string
error: 'note' diagnostics seen but not expected:
  File 
/b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm/tools/clang/test/SemaCXX/constant-expression-cxx1y.cpp
Line 447: use array indexing to silence this warning
2 errors generated.

On Thu, Dec 13, 2018 at 8:09 AM Sylvestre Ledru via cfe-commits
 wrote:
>
> Author: sylvestre
> Date: Thu Dec 13 08:06:23 2018
> New Revision: 349054
>
> URL: http://llvm.org/viewvc/llvm-project?rev=349054&view=rev
> Log:
> Make -Wstring-plus-int warns even if when the result is not out of bounds
>
> Summary: Patch by Arnaud Bienner
>
> Reviewers: sylvestre.ledru, thakis
>
> Reviewed By: thakis
>
> Subscribers: cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D55382
>
> Modified:
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/test/SemaCXX/string-plus-int.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=349054&r1=349053&r2=349054&view=diff
> ==
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Dec 13 08:06:23 2018
> @@ -9135,16 +9135,6 @@ static void diagnoseStringPlusInt(Sema &
>if (!IsStringPlusInt || IndexExpr->isValueDependent())
>  return;
>
> -  Expr::EvalResult Result;
> -  if (IndexExpr->EvaluateAsInt(Result, Self.getASTContext())) {
> -llvm::APSInt index = Result.Val.getInt();
> -unsigned StrLenWithNull = StrExpr->getLength() + 1;
> -if (index.isNonNegative() &&
> -index <= llvm::APSInt(llvm::APInt(index.getBitWidth(), 
> StrLenWithNull),
> -  index.isUnsigned()))
> -  return;
> -  }
> -
>SourceRange DiagRange(LHSExpr->getBeginLoc(), RHSExpr->getEndLoc());
>Self.Diag(OpLoc, diag::warn_string_plus_int)
><< DiagRange << IndexExpr->IgnoreImpCasts()->getType();
>
> Modified: cfe/trunk/test/SemaCXX/string-plus-int.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/string-plus-int.cpp?rev=349054&r1=349053&r2=349054&view=diff
> ==
> --- cfe/trunk/test/SemaCXX/string-plus-int.cpp (original)
> +++ cfe/trunk/test/SemaCXX/string-plus-int.cpp Thu Dec 13 08:06:23 2018
> @@ -31,37 +31,36 @@ void f(int index) {
>consume("foo" + 5);  // expected-warning {{adding 'int' to a string does 
> not append to the string}} expected-note {{use array indexing to silence this 
> warning}}
>consume("foo" + index);  // expected-warning {{adding 'int' to a string 
> does not append to the string}} expected-note {{use array indexing to silence 
> this warning}}
>consume("foo" + kMyEnum);  // expected-warning {{adding 'MyEnum' to a 
> string does not append to the string}} expected-note {{use array indexing to 
> silence this warning}}
> +  consume("foo" + kMySmallEnum); // expected-warning {{adding 'MyEnum' to a 
> string does not append to the string}} expected-note {{use array indexing to 
> silence this warning}}
>
>consume(5 + "foo");  // expected-warning {{adding 'int' to a string does 
> not append to the string}} expected-note {{use array indexing to silence this 
> warning}}
>consume(index + "foo");  // expected-warning {{adding 'int' to a string 
> does not append to the string}} expected-note {{use array indexing to silence 
> this warning}}
>consume(kMyEnum + "foo");  // expected-warning {{adding 'MyEnum' to a 
> string does not append to the string}} expected-note {{use array indexing to 
> silence this warning}}
> +  consume(kMySmallEnum + "foo"); // expected-warning {{adding 'MyEnum' to a 
> string does not append to the string}} expected-note {{use array indexing to 
> silence this warning}}
>
>// FIXME: suggest replacing with "foo"[5]
>consumeChar(*("foo" + 5));  // expected-warning {{adding 'int' to a string 
> does not append to the string}} expected-note {{use array indexing to silence 
> this warning}}
>consumeChar(*(5 + "foo"));  // expected-warning {{adding 'int' to a string 
> does not append to the string}} expected-note {{use array indexing to silence 
> this warning}}
>
>consume(L"foo" + 5);  // expected-warning {{adding 'int' to a string does 
> not append to the string}} expected-note {{use array indexing to silence this 
> warning}}
> +  consume(L"foo" + 2); // expected-warning {{adding 'int' to a string does 
> not append to the string}} expected-note {{use array indexing to silence this 
> warning}}
> +
> +  consume("foo" + 3);  // expected-warning {{adding 'int' t

r349054 - Make -Wstring-plus-int warns even if when the result is not out of bounds

2018-12-13 Thread Sylvestre Ledru via cfe-commits
Author: sylvestre
Date: Thu Dec 13 08:06:23 2018
New Revision: 349054

URL: http://llvm.org/viewvc/llvm-project?rev=349054&view=rev
Log:
Make -Wstring-plus-int warns even if when the result is not out of bounds

Summary: Patch by Arnaud Bienner

Reviewers: sylvestre.ledru, thakis

Reviewed By: thakis

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D55382

Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/SemaCXX/string-plus-int.cpp

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=349054&r1=349053&r2=349054&view=diff
==
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Dec 13 08:06:23 2018
@@ -9135,16 +9135,6 @@ static void diagnoseStringPlusInt(Sema &
   if (!IsStringPlusInt || IndexExpr->isValueDependent())
 return;
 
-  Expr::EvalResult Result;
-  if (IndexExpr->EvaluateAsInt(Result, Self.getASTContext())) {
-llvm::APSInt index = Result.Val.getInt();
-unsigned StrLenWithNull = StrExpr->getLength() + 1;
-if (index.isNonNegative() &&
-index <= llvm::APSInt(llvm::APInt(index.getBitWidth(), StrLenWithNull),
-  index.isUnsigned()))
-  return;
-  }
-
   SourceRange DiagRange(LHSExpr->getBeginLoc(), RHSExpr->getEndLoc());
   Self.Diag(OpLoc, diag::warn_string_plus_int)
   << DiagRange << IndexExpr->IgnoreImpCasts()->getType();

Modified: cfe/trunk/test/SemaCXX/string-plus-int.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/string-plus-int.cpp?rev=349054&r1=349053&r2=349054&view=diff
==
--- cfe/trunk/test/SemaCXX/string-plus-int.cpp (original)
+++ cfe/trunk/test/SemaCXX/string-plus-int.cpp Thu Dec 13 08:06:23 2018
@@ -31,37 +31,36 @@ void f(int index) {
   consume("foo" + 5);  // expected-warning {{adding 'int' to a string does not 
append to the string}} expected-note {{use array indexing to silence this 
warning}}
   consume("foo" + index);  // expected-warning {{adding 'int' to a string does 
not append to the string}} expected-note {{use array indexing to silence this 
warning}}
   consume("foo" + kMyEnum);  // expected-warning {{adding 'MyEnum' to a string 
does not append to the string}} expected-note {{use array indexing to silence 
this warning}}
+  consume("foo" + kMySmallEnum); // expected-warning {{adding 'MyEnum' to a 
string does not append to the string}} expected-note {{use array indexing to 
silence this warning}}
 
   consume(5 + "foo");  // expected-warning {{adding 'int' to a string does not 
append to the string}} expected-note {{use array indexing to silence this 
warning}}
   consume(index + "foo");  // expected-warning {{adding 'int' to a string does 
not append to the string}} expected-note {{use array indexing to silence this 
warning}}
   consume(kMyEnum + "foo");  // expected-warning {{adding 'MyEnum' to a string 
does not append to the string}} expected-note {{use array indexing to silence 
this warning}}
+  consume(kMySmallEnum + "foo"); // expected-warning {{adding 'MyEnum' to a 
string does not append to the string}} expected-note {{use array indexing to 
silence this warning}}
 
   // FIXME: suggest replacing with "foo"[5]
   consumeChar(*("foo" + 5));  // expected-warning {{adding 'int' to a string 
does not append to the string}} expected-note {{use array indexing to silence 
this warning}}
   consumeChar(*(5 + "foo"));  // expected-warning {{adding 'int' to a string 
does not append to the string}} expected-note {{use array indexing to silence 
this warning}}
 
   consume(L"foo" + 5);  // expected-warning {{adding 'int' to a string does 
not append to the string}} expected-note {{use array indexing to silence this 
warning}}
+  consume(L"foo" + 2); // expected-warning {{adding 'int' to a string does not 
append to the string}} expected-note {{use array indexing to silence this 
warning}}
+
+  consume("foo" + 3);  // expected-warning {{adding 'int' to a string does not 
append to the string}} expected-note {{use array indexing to silence this 
warning}}
+  consume("foo" + 4);  // expected-warning {{adding 'int' to a string does not 
append to the string}} expected-note {{use array indexing to silence this 
warning}}
+  consume("\pfoo" + 4);  // expected-warning {{adding 'int' to a string does 
not append to the string}} expected-note {{use array indexing to silence this 
warning}}
+
+  #define A "foo"
+  #define B "bar"
+  consume(A B + sizeof(A) - 1); // expected-warning {{to a string does not 
append to the string}} expected-note {{use array indexing to silence this 
warning}}
 
   // Should not warn.
   consume(&("foo"[3]));
   consume(&("foo"[index]));
   consume(&("foo"[kMyEnum]));
-  consume("foo" + kMySmallEnum);
-  consume(kMySmallEnum + "foo");
 
-  consume(L"foo" + 2);
-
-  consume("foo" + 3)