Looks like this broke bootstrap: http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/18993/steps/bootstrap%20clang/logs/stdio
On 6 July 2015 at 14:02, Davide Italiano <dav...@freebsd.org> wrote: > Author: davide > Date: Mon Jul 6 13:02:09 2015 > New Revision: 241478 > > URL: http://llvm.org/viewvc/llvm-project?rev=241478&view=rev > Log: > [Sema] Warn when shifting a negative value. > > Example: > % ./clang -Wshift-negative-value emit.c > emit.c:3:14: warning: shifting a negative signed value is undefined > [-Wshift-negative-value] > int a = -1 << 3; > ~~ ^ > 1 warning generated. > > PR: 24026 > Differential Revision: http://reviews.llvm.org/D10938 > Reviewed by: rsmith > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/test/CXX/expr/expr.const/p2-0x.cpp > cfe/trunk/test/Sema/shift.c > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=241478&r1=241477&r2=241478&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Jul 6 13:02:09 > 2015 > @@ -4740,6 +4740,8 @@ def warn_division_by_zero : Warning<"div > InGroup<DivZero>; > def warn_remainder_by_zero : Warning<"remainder by zero is undefined">, > InGroup<DivZero>; > +def warn_shift_lhs_negative : Warning<"shifting a negative signed value is > undefined">, > + InGroup<DiagGroup<"shift-negative-value">>; > def warn_shift_negative : Warning<"shift count is negative">, > InGroup<DiagGroup<"shift-count-negative">>; > def warn_shift_gt_typewidth : Warning<"shift count >= width of type">, > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=241478&r1=241477&r2=241478&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Jul 6 13:02:09 2015 > @@ -7937,9 +7937,19 @@ static void DiagnoseBadShiftValues(Sema& > // representable in the result type, so never warn for those. > llvm::APSInt Left; > if (LHS.get()->isValueDependent() || > - !LHS.get()->isIntegerConstantExpr(Left, S.Context) || > - LHSType->hasUnsignedIntegerRepresentation()) > + LHSType->hasUnsignedIntegerRepresentation() || > + !LHS.get()->EvaluateAsInt(Left, S.Context)) > return; > + > + // If LHS does not have a signed type and non-negative value > + // then, the behavior is undefined. Warn about it. > + if (Left.isNegative()) { > + S.DiagRuntimeBehavior(Loc, LHS.get(), > + S.PDiag(diag::warn_shift_lhs_negative) > + << LHS.get()->getSourceRange()); > + return; > + } > + > llvm::APInt ResultBits = > static_cast<llvm::APInt&>(Right) + Left.getMinSignedBits(); > if (LeftBits.uge(ResultBits)) > > Modified: cfe/trunk/test/CXX/expr/expr.const/p2-0x.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/expr/expr.const/p2-0x.cpp?rev=241478&r1=241477&r2=241478&view=diff > ============================================================================== > --- cfe/trunk/test/CXX/expr/expr.const/p2-0x.cpp (original) > +++ cfe/trunk/test/CXX/expr/expr.const/p2-0x.cpp Mon Jul 6 13:02:09 2015 > @@ -157,7 +157,7 @@ namespace UndefinedBehavior { > constexpr int shl_unsigned_negative = unsigned(-3) << 1; // ok > constexpr int shl_unsigned_into_sign = 1u << 31; // ok > constexpr int shl_unsigned_overflow = 1024u << 31; // ok > - constexpr int shl_signed_negative = (-3) << 1; // expected-error > {{constant expression}} expected-note {{left shift of negative value -3}} > + constexpr int shl_signed_negative = (-3) << 1; // expected-warning > {{shifting a negative signed value is undefined}} // expected-error > {{constant expression}} expected-note {{left shift of negative value -3}} > constexpr int shl_signed_ok = 1 << 30; // ok > constexpr int shl_signed_into_sign = 1 << 31; // ok (DR1457) > constexpr int shl_signed_into_sign_2 = 0x7fffffff << 1; // ok (DR1457) > > Modified: cfe/trunk/test/Sema/shift.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/shift.c?rev=241478&r1=241477&r2=241478&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/shift.c (original) > +++ cfe/trunk/test/Sema/shift.c Mon Jul 6 13:02:09 2015 > @@ -39,7 +39,8 @@ void test() { > i = 1 << (WORD_BIT - 2); > i = 2 << (WORD_BIT - 1); // expected-warning {{bits to represent, but > 'int' only has}} > i = 1 << (WORD_BIT - 1); // expected-warning {{sets the sign bit of the > shift expression}} > - i = -1 << (WORD_BIT - 1); > + i = -1 << (WORD_BIT - 1); // expected-warning {{shifting a negative signed > value is undefined}} > + i = -1 << 0; // expected-warning {{shifting a negative signed value is > undefined}} > i = 0 << (WORD_BIT - 1); > i = (char)1 << (WORD_BIT - 2); > > @@ -48,7 +49,7 @@ void test() { > u = 5U << (WORD_BIT - 1); > > long long int lli; > - lli = INT_MIN << 2; // expected-warning {{bits to represent, but 'int' > only has}} > + lli = INT_MIN << 2; // expected-warning {{shifting a negative signed value > is undefined}} > lli = 1LL << (sizeof(long long) * CHAR_BIT - 2); > } > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits