blob: 1386834200022596d2a874e484746f5e69cc251b [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// test w/ `pub run test -N invariant_booleans`
void deadCodeWithIfAndElseExit() {
int localFoo = 3, localBar = 4;
if (localFoo < localBar) {
return;
}
else {
return;
}
// ignore: dead_code
if (localFoo < localBar) { // OK
}
}
void returnMustUndefineAll() {
int localFoo = 3, localBar = 4;
if (localFoo < localBar) {
return;
// ignore: dead_code
if (localFoo < localBar) { // OK
}
}
}
void throwMustUndefineAll() {
int localFoo = 3, localBar = 4;
if (localFoo < localBar) {
throw new Exception();
// ignore: dead_code
if (localFoo < localBar) { // OK
}
}
}
void rethrowMustUndefineAll() {
int localFoo = 3, localBar = 4;
try {
} catch(exception) {
if (localFoo < localBar) {
rethrow;
// ignore: dead_code
if (localFoo < localBar) { // OK
}
}
}
}
void forStatementWithLabels() {
int localFoo = 3, localBar = 4;
label: for (;localFoo < 3;) {
for (;localBar>4;) {
break label;
}
}
if (localFoo < 3) {} // OK
}
void whileStatementWithLabels() {
int localFoo = 3, localBar = 4;
label: while (localFoo < 3) {
while (localBar>4) {
break label;
}
}
if (localFoo < 3) {} // OK
}
void forStatementTest1() {
int localFoo = 3, localBar = 4;
for (;localFoo < localBar;) {
print('hola mundo');
}
if (localFoo < localBar) { // LINT
print('should not see this');
}
}
void forStatementTest2() {
int localFoo = 3, localBar = 4, localBaz = 5;
for (;localFoo < localBar;) {
for (;localFoo < localBaz;) {
break;
}
}
if (localFoo < localBar) { // LINT
print('should not see this');
}
}
void forStatementTest3() {
int localFoo = 3, localBar = 4;
for (;localFoo < localBar ;) {
break;
}
if (localFoo < localBar) { // OK
print('should not see this');
}
}
void whileStatementTest1() {
int localFoo = 3, localBar = 4;
while (localFoo < localBar) {
print('hola mundo');
}
if (localFoo < localBar) { // LINT
print('should not see this');
}
}
void whileStatementTest2() {
int localFoo = 3, localBar = 4, localBaz = 5;
while (localFoo < localBar) {
while (localFoo < localBaz) {
break;
}
}
if (localFoo < localBar) { // LINT
print('should not see this');
}
}
void whileStatementTest3() {
int localFoo = 3, localBar = 4;
while (localFoo < localBar) {
break;
}
if (localFoo < localBar) { // OK
print('should not see this');
}
}
void forStatementWithLabeledBreak() {
int localFoo = 3, localBar = 4;
outer:
for (;localFoo < localBar;) {
if (localFoo < localBar - 1) {
break outer;
}
}
if (localFoo < localBar) { // OK
print('should not see this');
}
}
void whileStatementWithLabeledBreak() {
int localFoo = 3, localBar = 4;
outer:
while (localFoo < localBar) {
if (localFoo < localBar - 1) {
break outer;
}
}
if (localFoo < localBar) { // OK
print('should not see this');
}
}
int bar = 1;
int baz = 2;
int foo = 0;
bool setting;
class A {
bool foo;
int fooNumber;
}
class B {
bool bar;
int barNumber;
}
A a = new A();
B b = new B();
void bad() {
if ((foo == bar && someComputation()) ||
(foo != bar && otherComputation())) {} // OK
if (foo > bar || foo == bar) {} // OK
if (a.fooNumber > b.barNumber || a.fooNumber == b.barNumber) {} // OK
if (foo > bar && someComputation() || foo == bar) {} // OK
if (foo > bar || foo == bar && someComputation()) {} // OK
if (foo < bar - baz || foo > bar) {} // OK
if (setting == true) {} // OK
if (setting != true) {} // OK
if (a.foo == b.bar || a.foo != b.bar) {} // LINT
if (foo == bar || foo != bar) {} // LINT
if (foo == bar || bar != foo) {} // LINT
if (foo == bar && foo != bar) {} // LINT
if (foo == bar && someComputation() && foo != bar) {} // LINT
if (foo > bar && someComputation() && foo <= bar) {} // LINT
if (foo > bar && someComputation() && foo < bar) {} // LINT
if (foo < bar && someComputation() && foo > bar) {} // LINT
if (foo < bar && foo > bar) {} // LINT
if (true || foo == bar) {} // LINT
if (false || foo == bar) {} // LINT
if (false && foo == bar) {} // LINT
if (true && foo == bar) {} // LINT
if (foo > bar && foo == bar) {} // LINT
if (foo < bar && foo == bar) {} // LINT
if (foo > bar && someComputation() && foo == bar) {} // LINT
if (foo > bar && someComputation() || foo == bar && foo != bar) {} // LINT
if (foo > bar && foo > bar) {} // LINT
if (foo > bar && bar < foo) {} // LINT
if (foo == bar && bar == foo) {} // LINT
while (foo == bar && bar == foo) {} // LINT
for (; foo == bar && bar == foo;) {} // LINT
do {} while (foo == bar && bar == foo); // LINT
}
void nestedBad1_1() {
if (foo == bar) {
if (foo != bar) {} // LINT
}
}
void nestedBad1_2() {
if (foo == bar) {
while (foo != bar) {} // LINT
}
}
void nestedBad1_3() {
while (foo == bar) {
if (foo != bar) {} // LINT
}
}
void nestedBad2() {
if (foo == bar) {
return;
}
if (foo == bar) {} // LINT
}
void nestedBad7() {
if (foo < bar) {} else {
if (foo < bar) {} // LINT
}
}
void nestedBad8() {
if (foo <= bar) {
return;
}
if (foo == bar) {} // LINT
}
void nestedOK1() {
if (foo == bar) {
foo = baz;
if (foo != bar) {} // OK
}
}
void nestedOk2() {
if (foo == bar) {
return;
}
foo = baz;
if (foo == bar) {} // OK
}
void nestedOk3() {
if (foo < bar) {
return;
}
if (foo == bar) {} // OK
}
void nestedOk5() {
if (foo != null) {
if (bar != null) {
return;
}
}
if (bar != null) {} // OK
}
void nestedOk5_1() {
if (foo != null) {
if (bar != null) {
return;
}
}
if (foo != null) {} // OK
}
void nestedOk6() {
if (foo < bar) {} else if (foo > bar) {} // OK
}
void nestedOk7() {
if (foo < bar) {} else {
if (foo > bar) {} // OK
}
}
void nestedOk8() {
if (foo == bar) {
foo = baz;
if (foo == bar) {} // OK
}
}
bool otherComputation() {
// Ignore return value, assume more complex logic.
return false;
}
bool someComputation() {
// Ignore return value, assume more complex logic.
return false;
}
String sixDigits(int n) {
if (n >= 100000) return "$n";
if (n >= 10000) return "0$n";
if (n >= 1000) return "00$n";
if (n >= 100) return "000$n";
if (n >= 10) return "0000$n";
return "00000$n";
}
someFunction() {
int a = new DateTime.now().millisecondsSinceEpoch;
innerFunction() {
if (a > 0) {
return false;
}
}
otherInnerFunction() => a > 0 ? false : null;
if (a > 0) {
// OK
print('bla');
}
}
class Foo {
bool bar;
void sayHello() {
if (bar ?? false) print('hello');
}
}
Iterable bug368(Iterable values) {
if (values?.isEmpty ?? true) return [];
return values.toList();
}
bool bug371(dynamic other, dynamic productTypes) {
if (productTypes == null && other.productTypes == null) return true;
if (productTypes == null || other.productTypes == null) return false;
return true;
}
/// https://github.com/dart-lang/linter/issues/373
void bug373(int foo) {
bool bar = true;
if (foo == 4 && bar && foo > 4) {} // LINT
if (foo == 4 && bar) {
// doSomething();
if (foo > 4) { // LINT
// ...
}
// ...
}
}
void bug372(bool foo) {
if (foo) {
return;
}
// doSomething();
if (foo) { // LINT
// doSomethingElse();
}
}
void bug337_1(int offset, int length) {
if (offset >= length) {
return;
}
offset++;
if (offset >= length) { // OK
}
}
void bug337_2(int offset, int length) {
if (offset >= length) {
return;
}
offset--;
if (offset >= length) { // OK
}
}
void bug337_3(int offset, int length) {
if (offset >= length) {
return;
}
++offset;
if (offset >= length) { // OK
}
}
void bug337_4(int offset, int length) {
if (offset >= length) {
return;
}
--offset;
if (offset >= length) { // OK
}
}
void test337_5() {
int b = 2;
if (b > 0) {
b--;
if (b == 0) {
return;
}
if (b > 0) {
return;
}
}
}
void bug658() {
String text;
if ((text?.length ?? 0) != 0) {}
}
void bug811_1() {
final bar = 0;
final foo = 10;
for (var i = 0; i < foo; ++i) {}
for (var i = 0; i < foo; i++) {} // OK
if (bar == 10) {}
}
void bug811_2() {
var bar = 0;
final foo = 10;
for (bar = 0; bar < foo; ++bar) {}
for (bar = 0; bar < foo; bar++) {}
if (bar < foo) {} // LINT
}