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@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits