mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 23:59:47 +00:00
c959c9aba7
Change-Id: I3f67dd79ff2ee745cc2ea161ce7150630e805c97 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150186 Commit-Queue: Bob Nystrom <rnystrom@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com>
67 lines
2 KiB
Dart
67 lines
2 KiB
Dart
// Copyright (c) 2014, 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.
|
|
|
|
// This test broke dart2js.
|
|
// A compiler must not construct a critical edge on this program.
|
|
//
|
|
// In particular we have to watch out for:
|
|
// - the while-loop branch going to the body-block and to the exit-block, and
|
|
// - the exit-block having as incoming the condition-block and the
|
|
// break-blocks.
|
|
//
|
|
// Triggering the bug is relatively hard, since pushing instructions back the
|
|
// exit-block to the incoming blocks is not guaranteed to trigger an error.
|
|
// Dart2js frequently ended up with update-assignments just before the
|
|
// condition:
|
|
// for (int i = 0; state = state0, i < 10; i++) {
|
|
// if (..) { state = 1; }
|
|
// ...
|
|
// }
|
|
// use(state);
|
|
//
|
|
// In this case the "state" variable was assigned before the loop and then
|
|
// reassigned before the break. The exit-block pushed the assignment back
|
|
// to its incoming blocks and that's why the "state = state0" assignment ended
|
|
// up just before the condition.
|
|
// Note that the assignment was executed at every iteration instead of just
|
|
// when exiting the loop.
|
|
// This repeated assignments don't have any negative effect unless the state
|
|
// variable is also assigned and used inside the loop-body. It turns out that
|
|
// this is very rare and needs some tricks to make happen.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
String parse(String uri) {
|
|
int index = 0;
|
|
int char = -1;
|
|
|
|
void parseAuth() {
|
|
index;
|
|
char;
|
|
}
|
|
|
|
int state = 0;
|
|
while (true) {
|
|
char = uri.codeUnitAt(index);
|
|
if (char == 1234) {
|
|
state = (index == 0) ? 1 : 2;
|
|
break;
|
|
}
|
|
if (char == 0x3A) {
|
|
return "good";
|
|
}
|
|
index++;
|
|
}
|
|
|
|
if (state == 1) {
|
|
print(char == 1234);
|
|
print(index == uri.length);
|
|
}
|
|
return "bad";
|
|
}
|
|
|
|
main() {
|
|
Expect.equals("good", parse("dart:_foreign_helper"));
|
|
}
|