r349054 - Make -Wstring-plus-int warns even if when the result is not out of bounds
Evgenii Stepanov via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 13 12:51:13 PST 2018
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
<cfe-commits at lists.llvm.org> 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' 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); // Points at the \0
> - consume("foo" + 4); // Points 1 past the \0, which is legal too.
> - consume("\pfoo" + 4); // Pascal strings don't have a trailing \0, but they
> - // have a leading length byte, so this is fine too.
>
> consume("foo" + kMyOperatorOverloadedEnum);
> consume(kMyOperatorOverloadedEnum + "foo");
> -
> - #define A "foo"
> - #define B "bar"
> - consume(A B + sizeof(A) - 1);
> }
>
> template <typename T>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list