Commit Graph

30930 Commits

Author SHA1 Message Date
bors
75c1fb535d auto merge of #15565 : alexcrichton/rust/issue-15475, r=huonw
If a plugin registrar is available, the library must be found in dylib form, not
just in rlib form.

Closes #15475
2014-07-11 18:06:37 +00:00
John Clements
c253b3675a add Macro Exterminator
the Macro Exterminator ensures that there are no macro invocations in
an AST. This should help make later passes confident that there aren't
hidden items, methods, expressions, etc.
2014-07-11 10:32:42 -07:00
John Clements
53642eed80 make walk/visit_mac opt-in only
macros can expand into arbitrary items, exprs, etc. This
means that using a default walker or folder on an AST before
macro expansion is complete will miss things (the things that
the macros expand into). As a partial fence against this, this
commit moves the default traversal of macros into a separate
procedure, and makes the default trait implementation signal
an error. This means that Folders and Visitors can traverse
macros if they want to, but they need to explicitly add an
impl that calls the walk_mac or fold_mac procedure

This should prevent problems down the road.
2014-07-11 10:32:41 -07:00
John Clements
f1ad425199 use side table to store exported macros
Per discussion with @sfackler, refactored the expander to
change the way that exported macros are collected. Specifically,
a crate now contains a side table of spans that exported macros
go into.

This has two benefits. First, the encoder doesn't need to scan through
the expanded crate in order to discover exported macros. Second, the
expander can drop all expanded macros from the crate, with the pleasant
result that a fully expanded crate contains no macro invocations (which
include macro definitions).
2014-07-11 10:32:41 -07:00
John Clements
50d9965c25 rename one of the two confusing MacroExpanders
There were two things named MacroExpander, which was confusing. I renamed
one of them TTMacroExpander.

[breaking change]
2014-07-11 10:32:30 -07:00
bors
aeab2501d1 auto merge of #15503 : pnkfelix/rust/fsk-linear-deriving-partialord, r=huonw
Instead of generating a separate case (albeit trivial) for each of the N*N cases when comparing two instances of an enum with N variants, this `deriving` uses the strategy outlined here: https://github.com/rust-lang/rust/issues/15375#issuecomment-47994007

In particular, it generates code that looks more like this:

```rust
    match (this, that, ...) {
      (Variant1, Variant1, Variant1) => ... // delegate Matching on Variant1
      (Variant2, Variant2, Variant2) => ... // delegate Matching on Variant2
      ...
      _ => {
        let index_tup = {
          let idx_this = match this { Variant1 => 0u, Variant2 => 1u, ... };
          let idx_that = match that { Variant1 => 0u, Variant2 => 1u, ... };
          ...
          (idx_this, idx_that, ...)
        };
        ... // delegate to catch-all; it can inspect `index_tup` for its logic
      }
    }
```

While adding a new variant to the `const_nonmatching` flag (and renaming it to `on_nonmatching`) to allow expressing the above (while still allowing one to opt back into the old `O(N^2)` and in general `O(N^K)` (where `K` is the number of self arguments) code generation behavior), I had two realizations:

 1. Observation: Nothing except for the comparison derivings (`PartialOrd`, `Ord`, `PartialEq`, `Eq`) were even using the old `O(N^K)` code generator.  So after this hypothetically lands, *nothing* needs to use them, and thus that code generation strategy could be removed, under the assumption that it is very unlikely that any `deriving` mode will actually need that level of generality.
 2. Observation: The new code generator I am adding can actually be unified with all of the other code generators that just dispatch on the variant tag (they all assume that there is only one self argument).

These two observations mean that one can get rid of the `const_nonmatching` (aka `on_nonmatching`) entirely.  So I did that too in this PR.

The question is: Do we actually want to follow through on both of the above observations?  I'm pretty sure the second observation is a pure win.  But there *might* be someone out there with an example that invalidates the reasoning in the first observation.  That is, there might be a client out there with an example of hypothetical deriving mode that wants to opt into the `O(N^K)` behavior.  So, if that is true, then I can revise this PR to resurrect the `on_nonmatching` flag and provide a way to access the `O(N^K)` behavior.

The manner in which I choose to squash these commits during a post-review rebase depends on the answer to the above question.

Fix #15375.
2014-07-11 15:56:38 +00:00
Felix S. Klock II
5cee57869c Removed dead structures after changes to PartialOrd/Ord derivings.
Remove the `NonMatchesExplode` variant now that no deriving impl uses it.
Removed `EnumNonMatching` entirely.
Remove now irrelevant `on_matching` field and `HandleNonMatchingEnums` type.
Removed unused `EnumNonMatchFunc` type def.

Drive-by: revise `EnumNonMatchCollapsedFunc` doc.

Made all calls to `expand_enum_method_body` go directly to
`build_enum_match_tuple`.

Alpha-rename `enum_nonmatch_g` back to `enum_nonmatch_f` to reduce overall diff noise.
Inline sole call of `some_ordering_const`.
Inline sole call of `ordering_const`.

Removed a bunch of code that became dead after the above changes.
2014-07-11 17:32:23 +02:00
Felix S. Klock II
c8ae44682d O(n*k) code-size deriving on enums (better than previous O(n^k)).
In the above formulas, `n` is the number of variants, and `k` is the
number of self-args fed into deriving.  In the particular case of
interest (namely `PartialOrd` and `Ord`), `k` is always 2, so we are
basically comparing `O(n)` versus `O(n^2)`.

Also, the stage is set for having *all* enum deriving codes go through
`build_enum_match_tuple` and getting rid of `build_enum_match`.

Also, seriously attempted to clean up the code itself.  Added a bunch
of comments attempting to document what I learned as I worked through
the original code and adapted it to this new strategy.
2014-07-11 17:32:18 +02:00
Felix S. Klock II
5d1bdc320b Revise the const_nonmatching flag with more info about author's intent.
In particular, I want authors of deriving modes to understand what
they are opting into (namely quadratic code size or worse) when they
select NonMatchesExplode.
2014-07-11 17:01:01 +02:00
bors
b8059f730e auto merge of #15580 : pnkfelix/rust/fsk-fix-15558, r=alexcrichton
Fix #15558.
2014-07-11 13:51:39 +00:00
Kevin Walter
8fab111e79 Add rustc --pretty flowgraph to man page 2014-07-11 15:51:01 +02:00
Arjan Topolovec
30f07e9067 Allow writes of length 0 to a full buffer 2014-07-11 15:45:06 +02:00
bors
c9a77d03dd auto merge of #15576 : mrmonday/rust/patch-1, r=alexcrichton
Add a couple of lines mentioning event_loop_factory - no clear error message is given if you attempt to perform I/O in tasks created in this fashion. I spent a many hours debugging this yesterday which would have been avoided if it were documented.
2014-07-11 12:06:40 +00:00
bors
ca56650d40 auto merge of #15575 : mvdnes/rust/spinlock_error, r=alexcrichton
The current example of a spinlock was not correct. The lock is actually acquired
when `old == result`. So we only need to deschedule when this is not the case.
2014-07-11 10:21:42 +00:00
root
20a6a6d848 rustdoc: Change type name of raw pointer from *T to *const T
Update the formatting of raw immutable pointers to print *const T.
2014-07-11 11:35:02 +02:00
bors
559cf92889 auto merge of #15574 : omasanori/rust/hidden, r=huonw 2014-07-11 08:36:40 +00:00
Adrien Tétar
f26c31d695 webfonts: name fix 2014-07-11 10:20:10 +02:00
bors
e11e094c0a auto merge of #15570 : omasanori/rust/radix, r=alexcrichton 2014-07-11 05:36:37 +00:00
Aaron Turon
0487e6387b Bug fixes for stability tracking
This commit adds correct stability tracking for struct fields and
corrects some places where rustdoc was not pulling the stability data.
2014-07-10 20:51:35 -07:00
Aaron Turon
4d16de01d0 rustdoc: Add stability dashboard
This commit adds a crate-level dashboard summarizing the stability
levels of all items for all submodules of the crate.

The information is also written as a json file, intended for consumption
by pages like http://huonw.github.io/isrustfastyet/

Closes #13541
2014-07-10 20:51:35 -07:00
Brian Anderson
5ee270a148 install: Run ldconfig when installing on Unix. Closes #15596.
If ldconfig fails it emits a warning. This is very possible when installing
to a non-system directory, so the warning tries to indicate that it may
not be a problem.
2014-07-10 18:27:21 -07:00
Brian Anderson
ad82cb5621 install: Make the LD_LIRARY_PATH warning more aesthetic 2014-07-10 18:16:48 -07:00
bors
b57d272e99 auto merge of #15564 : alexcrichton/rust/moar-hash, r=huonw
- semver::Version is now Eq, Ord, and Hash
- Path is now PartialOrd and Ord
2014-07-11 01:11:36 +00:00
Yuri Albuquerque
175d215eb6 Some documentation fixes and improvements 2014-07-10 19:51:11 -04:00
bors
0e80dbe59e auto merge of #15336 : jakub-/rust/diagnostics, r=brson
This is a continuation of @brson's work from https://github.com/rust-lang/rust/pull/12144.

This implements the minimal scaffolding that allows mapping diagnostic messages to alpha-numeric codes, which could improve the searchability of errors. In addition, there's a new compiler option, `--explain {code}` which takes an error code and prints out a somewhat detailed explanation of the error. Example:

```rust
fn f(x: Option<bool>) {
	match x {
		Some(true) | Some(false) => (),
		None => (),
		Some(true) => ()
	}
}
```

```shell
[~/rust]$ ./build/x86_64-apple-darwin/stage2/bin/rustc ./diagnostics.rs --crate-type dylib
diagnostics.rs:5:3: 5:13 error: unreachable pattern [E0001] (pass `--explain E0001` to see a detailed explanation)
diagnostics.rs:5 		Some(true) => ()
                 		^~~~~~~~~~
error: aborting due to previous error
[~/rust]$ ./build/x86_64-apple-darwin/stage2/bin/rustc --explain E0001

    This error suggests that the expression arm corresponding to the noted pattern
    will never be reached as for all possible values of the expression being matched,
    one of the preceeding patterns will match.

    This means that perhaps some of the preceeding patterns are too general, this
    one is too specific or the ordering is incorrect.

```

I've refrained from migrating many errors to actually use the new macros as it can be done in an incremental fashion but if we're happy with the approach, it'd be good to do all of them sooner rather than later.

Originally, I was going to make libdiagnostics a separate crate but that's posing some interesting challenges with semi-circular dependencies. In particular, librustc would have a plugin-phase dependency on libdiagnostics, which itself depends on librustc. Per my conversation with @alexcrichton, it seems like the snapshotting process would also have to change. So for now the relevant modules from libdiagnostics are included using `#[path = ...] mod`.
2014-07-10 23:26:39 +00:00
Jakub Wieczorek
9b9cce2316 Add scaffolding for assigning alpha-numeric codes to rustc diagnostics 2014-07-11 00:32:00 +02:00
bors
a672456c40 auto merge of #15353 : aturon/rust/env-hashmap, r=alexcrichton
This commit adds `env_insert` and `env_remove` methods to the `Command`
builder, easing updates to the environment variables for the child
process. The existing method, `env`, is still available for overriding
the entire environment in one shot (after which the `env_insert` and
`env_remove` methods can be used to make further adjustments).

To support these new methods, the internal `env` representation for
`Command` has been changed to an optional `HashMap` holding owned
`CString`s (to support non-utf8 data). The `HashMap` is only
materialized if the environment is updated. The implementation does not
try hard to avoid allocation, since the cost of launching a process will
dwarf any allocation cost.

This patch also adds `PartialOrd`, `Eq`, and `Hash` implementations for
`CString`.
2014-07-10 21:41:36 +00:00
Aaron Turon
bfa853f8ed io::process::Command: add fine-grained env builder
This commit changes the `io::process::Command` API to provide
fine-grained control over the environment:

* The `env` method now inserts/updates a key/value pair.
* The `env_remove` method removes a key from the environment.
* The old `env` method, which sets the entire environment in one shot,
  is renamed to `env_set_all`. It can be used in conjunction with the
  finer-grained methods. This renaming is a breaking change.

To support these new methods, the internal `env` representation for
`Command` has been changed to an optional `HashMap` holding owned
`CString`s (to support non-utf8 data). The `HashMap` is only
materialized if the environment is updated. The implementation does not
try hard to avoid allocation, since the cost of launching a process will
dwarf any allocation cost.

This patch also adds `PartialOrd`, `Eq`, and `Hash` implementations for
`CString`.

[breaking-change]
2014-07-10 12:16:16 -07:00
bors
8bbf598d50 auto merge of #15559 : fhahn/rust/issue-15445-mut-cast, r=alexcrichton
I've added an error message for casts from raw pointers to floats #15445.
2014-07-10 19:06:59 +00:00
Alex Crichton
c26cd9f05d rustc: Exclude #[repr(C)] from non camel case
C structs predominately do not use camel case identifiers, and we have a clear
indicator for what's a C struct now, so excuse all of them from this stylistic
lint.
2014-07-10 10:19:38 -07:00
Alex Crichton
6bd79d32e9 rustc: Always mark #[crate_name] as used
It's just an annoying error if you use --crate-name on the command line and you
also have a #[crate_name] specified
2014-07-10 10:19:10 -07:00
Felix S. Klock II
59ab65b2d9 More robust install.sh: do runnability test in fresh subdirectory.
Fix #15558.
2014-07-10 19:18:46 +02:00
bors
345886cfdd auto merge of #14519 : hirschenberger/rust/issue-10934, r=alexcrichton
Issue #10934
2014-07-10 17:16:30 +00:00
Robert Clipsham
b5dd258884 Document event_loop_factory usage
Add a couple of lines mentioning event_loop_factory - no clear error message is
given if you attempt to perform I/O in tasks created in this fashion.
2014-07-10 16:52:34 +01:00
bors
7ab9bfab4e auto merge of #15578 : alexcrichton/rust/fix-dist-again, r=pnkfelix
This is already checked by the install script, no need to check it twice.
2014-07-10 15:34:02 +00:00
Alex Crichton
3e49647a49 mk: Don't run rustc manually during distcheck
This is already checked by the install script, no need to check it twice.
2014-07-10 08:09:43 -07:00
Alex Crichton
fe48c3b620 rustc: Forbid plugin_registrar in only rlib form
If a plugin registrar is available, the library must be found in dylib form, not
just in rlib form.

Closes #15475
2014-07-10 07:51:50 -07:00
Alex Crichton
8aa8ca7991 std: Add some implementation of common traits
- semver::Version is now Eq, Ord, and Hash
- Path is now PartialOrd and Ord
2014-07-10 07:50:58 -07:00
bors
f9fe251777 auto merge of #15569 : pcwalton/rust/reexport-intrinsics, r=cmr
code bloat.

This didn't make a difference in any compile times that I saw, but it
fits what we're doing with `transmute` and seems prudent.

r? @alexcrichton
2014-07-10 12:46:30 +00:00
OGINO Masanori
7bed325254 Remove deprecated std::unstable module.
Signed-off-by: OGINO Masanori <masanori.ogino@gmail.com>
2014-07-10 20:01:57 +09:00
bors
a1bd5d359b auto merge of #15563 : luqmana/rust/nif, r=pcwalton 2014-07-10 11:01:32 +00:00
Florian Hahn
9bc7b6f437 typeck: check casts from pointers to floats, closes #15445 2014-07-10 12:28:46 +02:00
Mathijs van de Nes
c22b22d7b1 Mistake in AtomicBool spinlock example
The current example of a spinlock was not correct. The lock is actually acquired
when old == result. So we only need to deschedule when this is not the case.
2014-07-10 11:55:04 +02:00
bors
f865812451 auto merge of #15566 : japaric/rust/command-clone, r=alexcrichton
Allows use cases like this one:

``` rust
use std::io::Command;

fn main() {
    let mut cmd = Command::new("ls");
    cmd.arg("-l");

    for &dir in ["a", "b", "c"].iter() {
        println!("{}", cmd.clone().arg(dir));
    }
}
```

Output:
```
ls '-l' 'a'
ls '-l' 'b'
ls '-l' 'c'
```
Without the `clone()`, you'll end up with:
```
ls '-l' 'a'
ls '-l' 'a' 'b'
ls '-l' 'a' 'b' 'c'
```

cc #15294
2014-07-10 09:16:29 +00:00
Falco Hirschenberger
f8bc571df7 Add range lint for float literals, fixing #10934 2014-07-10 09:38:15 +02:00
OGINO Masanori
780a8291aa Use std::fmt::radix instead of to_str_radix.
Signed-off-by: OGINO Masanori <masanori.ogino@gmail.com>
2014-07-10 16:16:47 +09:00
Patrick Walton
6f96abf738 libcore: Reexport a couple of widely-used low-level intrinsics to reduce
code bloat.

This didn't make a difference in any compile times that I saw, but it
fits what we're doing with `transmute` and seems prudent.
2014-07-09 22:28:23 -07:00
bors
6372915a78 auto merge of #15561 : huonw/rust/must-use-iterators, r=alexcrichton
Similar to the stability attributes, a type annotated with `#[must_use =
"informative snippet"]` will print the normal warning message along with
"informative snippet". This allows the type author to provide some
guidance about why the type should be used.

---

It can be a little unintuitive that something like `v.iter().map(|x|
println!("{}", x));` does nothing: the majority of the iterator adaptors
are lazy and do not execute anything until something calls `next`, e.g.
a `for` loop, `collect`, `fold`, etc.

The majority of such errors can be seen by someone writing something
like the above, i.e. just calling an iterator adaptor and doing nothing
with it (and doing this is certainly useless), so we can co-opt the
`must_use` lint, using the message functionality to give a hint to the
reason why.

Fixes #14666.
2014-07-10 05:16:28 +00:00
bors
898701cb35 auto merge of #15556 : alexcrichton/rust/snapshots, r=brson
Closes #15544
2014-07-10 03:21:30 +00:00
Luqman Aden
83122af6ca librustc: Translate input for transmute directly into dest. 2014-07-09 20:11:40 -07:00