1241 Commits

Author SHA1 Message Date
Marijn Haverbeke
537d879dc1 Properly handle lifetime of aliases in nested blocks
There was a bug that would cause the alias analyser to allow you to
invalidate an alias that was no longer directly referred to, even if
another alias was rooted in it. It now properly tracks dependencies
between live aliases.

Required another case of copying values in map.rs.
2011-06-09 14:19:13 +02:00
Marijn Haverbeke
beda82ddf1 A revised, improved alias-checker
The old system tried to ensure that the location an alias pointed at
would retain its type. That turned out to not be strong enough in the
face of aliases to the inside of tags.

The new system instead proves that values pointed to by aliases are
not replaced (or invalidated in some other way) at all. It knows of
two sufficient conditions for this, and tries to prove at least of
them:

A) The alias is 'immutably rooted' in a local, and this local is not
   reassigned for the lifetime of the alias. Immutably rooted means
   the alias refers to the local itself, or to something reachable
   from the local through immutable dereferencing.

B) No value whose type might include the type of the 'inner mutable
   element' of the thing the alias refers to (for example, the box in
   rec(mutable x = @mutable int)) is from the outer scope is accessed
   for the lifetime of the alias. This means for functions, no other
   argument types may include the alias's inner mutable type. For alt,
   for each, and for, it means the body does not refer to any locals
   originating from outside their scope that include this type.

The lifetime of an alias in an alt, for each, or for body is defined
as the range from its definition to its last use, not to the point
where it goes out of scope. This makes working around these
restrictions somewhat less annoying. For example, you can assign to
your alt-ed value you don't refer to any bindings afterwards.
2011-06-09 13:11:29 +02:00
Marijn Haverbeke
bd90c7a3cb Add new visitor framework 2011-06-09 13:08:38 +02:00
Patrick Walton
6feb1dfd76 rustc: Don't eagerly resolve type variables after unification 2011-06-08 18:42:34 -07:00
Patrick Walton
cc7a8b668f rustc: Make resolve_all_vars() check to see whether the type actually has vars before folding over it; also remove some debug code. 2x typechecking speedup. 2011-06-08 18:05:45 -07:00
Patrick Walton
7527084e62 rustc: Don't generate so many variables when typechecking functions; remove mo_either 2011-06-08 18:05:45 -07:00
Patrick Walton
99c72b98b5 rustc: Use cnames in ty_to_str again; debugging code crept in 2011-06-08 15:49:46 -07:00
Patrick Walton
cc06bd4aa5 rustc: Add some miscellaneous demands that pushdown had previously caught; put out burning tinderbox 2011-06-08 15:33:16 -07:00
Patrick Walton
4571172c03 rustc: Remove pushdown. 15 second improvement. 2011-06-08 12:24:05 -07:00
Graydon Hoare
f54f2799c3 Merge pull request #403 from espindola/newllvm
Update rust to build with newer llvm versions.
2011-06-08 11:41:01 -07:00
Rafael Ávila de Espíndola
698022d351 Update rust to build with newer llvm versions. 2011-06-08 14:08:24 -04:00
Patrick Walton
08dcb9306b rustc: Remove all traces of the unification cache 2011-06-08 10:52:12 -07:00
Rafael Ávila de Espíndola
d360c481e8 Don't force the fetch of main.o from main.a, we are not using main.a anymore. 2011-06-08 13:47:21 -04:00
Josh Matthews
2235fb73ef Add optional message to fail. 2011-06-08 04:02:55 -04:00
Patrick Walton
0857d22c04 rustc: Print out a real error message on unresolved types. Puts out burning tinderbox. 2011-06-07 23:03:41 -07:00
Patrick Walton
ddec6b5f47 rustc: Use a set-based approach to unification; remove ty_bound_param and ty_local.
Sorry, big perf regression; will fix soon.
2011-06-07 19:33:18 -07:00
Graydon Hoare
721c5bbee8 More work on proper linkage name-mangling. Almost right, aside from version numbers. 2011-06-07 18:08:17 -07:00
Lindsey Kuper
a4ca75e6af For consistency, use ctxt instead of ty_ctxt outside of unify. 2011-06-07 15:18:30 -07:00
Lindsey Kuper
ab69c4a98f Removing dead code and redundant fails; changing fails to sess.bug
calls (issue #444).
2011-06-07 14:12:34 -07:00
Rafael Ávila de Espíndola
b1d6f12a05 Don't put a copy of main (the C one) in each binary we produce. This is a step
in getting a driver that works on all linux systems.

Sorry for the linker hacks, I will remove them after snapshotting a new compiler.
2011-06-07 16:56:27 -04:00
Graydon Hoare
319156c8d1 Begin tidying up name-mangling rules. 2011-06-06 15:48:47 -07:00
Rafael Ávila de Espíndola
ee54fa5c7d Implement enough support for pointer to get an identity function working. 2011-06-06 16:36:01 -04:00
Marijn Haverbeke
4bd5f834b0 First take on an alias-safety checker
The alias checker works by ensuring that any value to which an alias
is created is rooted in some way that ensures it outlives the alias.

It is now disallowed to create an alias to the content of a mutable
box, or to a box hanging off a mutable field. There is also machinery
in place to prevent assignment to local variables whenever they are
the root of a live alias.
2011-06-06 21:24:03 +02:00
Marijn Haverbeke
2b334f061a Change unsafe aliases
This litters aberrations like 'alt({foo.bar}) { ... }' and f({*baz})
though the code (mostly in trans.rs). These are a way to explicitly
copy the given value so that it can be safely aliased. At some point
we'll probably want a more explicit copy operator.
2011-06-06 21:09:55 +02:00
Brian Anderson
4d8f715dab rustc: Make resolve::unresolved return !. Remove redundant fails 2011-06-05 00:11:44 -04:00
Lindsey Kuper
2736d63db0 Adding comments; removing dead code. 2011-06-04 19:38:11 -07:00
Lindsey Kuper
5f95766a40 Remove redundant 'fail' exprs and dead code; use sess.bug or
sess.span_err instead of 'fail'.  (issue #444)
2011-06-04 18:34:40 -07:00
Lindsey Kuper
69325f815d More comments. 2011-06-03 17:16:28 -07:00
Lindsey Kuper
dcf7fbf833 Comments and cleanup. 2011-06-03 17:09:50 -07:00
Graydon Hoare
088ab03fdb Add spans to fields, args, methods. Improve pp of same. 2011-06-03 15:42:42 -07:00
Rafael Ávila de Espíndola
ba74c6cfdc Boilerplate for pointers. Sorry for missing this on the first patch. 2011-06-03 15:02:58 -04:00
Lindsey Kuper
dc29dead2e Removing redundant "fail"s. 2011-06-02 18:15:29 -07:00
Patrick Walton
ad9afefa10 rustc: Typecheck patterns from the top down; remove pushdown_pat 2011-06-02 18:11:26 -07:00
Tim Chevalier
ba377c043d Handle _|_ values properly in trans
Generate an LLVMUndef value of the proper type for an argument of
type _|_. Otherwise we get an LLVM assertion failure.
2011-06-02 17:52:04 -07:00
Tim Chevalier
468786e36d Fix unification bug
Hello from SFO Terminal 3!

unify_fn_common had the expected and actual types reversed in one
place. This was causing the type of an occurence of a function f
with type fn(int) -> T to be set to fn(_|_) -> T at a call site like
f(fail); I think this was also making some of the type error messages
come out backwards, but I haven't checked.

Also: ty_bot does not contain pointers
2011-06-02 17:52:04 -07:00
Patrick Walton
c515ed13de Merge pull request #450 from paulstansifer/quick_error_message_fix_2
Flatten functions and objects in trans::simplify_type.
2011-06-02 17:43:11 -07:00
Paul Stansifer
20bd927c3f Flatten functions and objects in trans::simplify_type. 2011-06-02 17:40:12 -07:00
Lindsey Kuper
3a6b5576ac Refactor make_fp_cmp_glue and make_integral_cmp_glue into one. 2011-06-02 16:35:25 -07:00
Paul Stansifer
1377e9b341 Implement pcwalton's code review suggestions. 2011-06-02 15:12:17 -07:00
Paul Stansifer
5cd10d2fef Error message, instead of segfault, when recursive types are used. 2011-06-02 14:03:17 -07:00
Tim Chevalier
24c9d7e5f8 Improve type error message for non-constructor in pattern 2011-06-01 18:15:12 -07:00
Tim Chevalier
1402cd101b Redo typestate-related data structures to support predicate constraints. No actual support yet, just infrastructure. 2011-06-01 18:14:48 -07:00
Lindsey Kuper
528c6516f0 Use span_err instead of err. Fixes issue #444. 2011-06-01 17:22:23 -07:00
Patrick Walton
af9272f70e rustc: Remove rustboot workaround from walk::default_visitor() 2011-06-01 16:52:22 -07:00
Patrick Walton
8851ae0423 rustc: Allow walking over patterns 2011-06-01 16:47:24 -07:00
Lindsey Kuper
dba9caeba9 Comments. 2011-06-01 16:39:52 -07:00
Rafael Ávila de Espíndola
a6ca9c2922 Don't create an empty section. 2011-06-01 15:59:28 -04:00
Rafael Ávila de Espíndola
30efdeeca1 Visibility is an ELF concept and protected visibility is not very well implemented,
avoid using it for now.

Instead, mark pairs that are not needed elsewhere as internal.
2011-06-01 15:45:31 -04:00
Lindsey Kuper
649a7bf38a Comments and cleanup. 2011-06-01 11:34:52 -07:00
Paul Stansifer
9f5dddf08c Now imports are not re-exported unless 'export' is explicitly used. 2011-05-31 18:43:26 -07:00