| Age | Commit message (Collapse) | Author | Lines |
|
|
|
Use it for the ast_map. Cuts 40% off the time spent prior to LLVM.
|
|
This was doing a redundant hashmap lookup. Removing the redundancy trims 5%
(2.8s) off rustc's compile time
|
|
Includes assignment operations. Add regression tests for lots of less useful,
less used or unexpected combinations, as well as a selection of compile-fail
tests. Closes #500 (again!)
|
|
Sorry. This is the kind of thing I do when I'm on a plane and too
tired to manage anything that requires thinking.
|
|
|
|
This will probably need more work, as moving doesn't appear to do
quite the right thing yet in general, and we should also check
somewhere that we're not, for example, moving out the content out of
an immutable field (probably moving out of fields is not okay in
general).
|
|
Non-copyability is not enforced yet, and something is still flaky with
dropping of the internal value, so don't actually use them yet. I'm
merging this in so that I don't have to keep merging against new
patches.
|
|
|
|
|
|
Modified typestate to throw away any constraints mentioning a
variable on the LHS of an assignment, recv, assign_op, or on
either side of a swap.
Some code cleanup as well.
|
|
of explicitly casing.
|
|
As a side effect, this fixes a bug where typestate would not properly be checked
inside of fn expressions.
|
|
names. Update the typestate code to understand this.
|
|
interior vectors if the unit size is dynamic
|
|
Typeck and trans used to, by historical coincidence, use the item_obj
node id, which was used to identify the obj type by the rest of the
system, for the constructor function. This is now identified by the
ctor id stored in the tag throughout.
|
|
This in preparation of making 'res' a keyword for defining resources.
Please don't introduce too many new ones in the meantime...
|
|
Since obj constructors and types have different def_ids now,
their def can simply be a def_fn and a def_ty.
|
|
types
|
|
|
|
|
|
The implementation is so simple it might be considered cheating: at almost
every step the expr_ternary is just converted to expr_if.
|
|
|
|
We decided to use metadata for the more complex cases, and a simple
string is enough for rustc right now.
|
|
|
|
|
|
If you use a function expecting an alias argument in a context that
expects a function expecting a value argument, or vice versa, the
previous error message complained that the number of arguments was
wrong. Fixed the error message to be accurate.
|
|
typestate now drops constraints correctly in the post-state of
a move expression or a declaration whose op is a move. It doesn't
yet drop constraints mentioning variables that get updated.
To do this, I had to change typestate to use trit-vectors instead
of bit-vectors, because for every constraint, there are three
possible values: known-to-be-false (e.g. after x <- y, init(y) is
known-to-be-false), known-to-be-true, and unknown. Before, we
conflated known-to-be-false with unknown. But move requires them
to be treated differently. Consider:
(program a)
(a1) x = 1;
(a2) y <- x;
(a3) log x;
(program b)
(b1) x = 1;
(b2) y <- z;
(b3) log x;
With only two values, the postcondition of statement a2 for
constraint init(x) is the same as that of b2: 0. But in (a2)'s
postcondition, init(x) *must* be false, but in (b2)'s condition,
it's just whatever it was in the postcondition of the preceding statement.
|
|
Closes #367
|
|
|
|
This makes the error message correctly identify the term that wasn't the
expected type. Issue #516.
|
|
|
|
This is so that subsequent reports about type mismatches get the types
correct.
Issue #516
|
|
|
|
|
|
|
|
module, not just everything exported.
|
|
Examples: #[test], #[link(name = "vers")]
Issue #487
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This code was causing a bounds check failure:
fn hd[U](&vec[U] v) -> U {
fn hd1(&vec[U] w) -> U {
ret w.(0);
}
ret hd1(v);
}
because in hd1, U was being treated as if it referred to a type
parameter of hd1, rather than referring to the lexically enclosing binding
for U that's part of hd.
I'm actually not sure whether this is a legit program or not. But I wanted
to get rid of the bounds check error, so I assumed that program shouldn't
compile and made it a proper error message.
|
|
This involved, in part, changing the ast::def type so that a def_fn
has a "purity" field. This lets the typechecker determine whether
functions defined in other crates are pure.
It also required updating some error messages in tests. As a test
for cross-crate constrained functions, I added a safe_slice function
to std::str (slice(), with one of the asserts replaced with a
function precondition) and some test cases (various versions of
fn-constraint.rs) that call it. Also, I changed "fn" to "pred" for
some of the boolean functions in std::uint.
|
|
|
|
|
|
into four separate issues (#538, #539, #540, #543) with corresponding
tests.
|
|
This simplifies the tag variants a bit and makes expr_node_id
obsolete.
|