]> git.lizzy.rs Git - rust.git/commitdiff
test: Begin running the language ref examples. Mostly xfailed
authorBrian Anderson <banderson@mozilla.com>
Tue, 20 Mar 2012 23:49:12 +0000 (16:49 -0700)
committerBrian Anderson <banderson@mozilla.com>
Wed, 21 Mar 2012 01:59:21 +0000 (18:59 -0700)
configure
doc/rust.md
mk/tests.mk
src/etc/extract-tests.py

index 70ea7d4b4e2a2aee778510237ce683b21acb01c5..20015674c352853596124628a2beed36d3ed5eb3 100755 (executable)
--- a/configure
+++ b/configure
@@ -476,6 +476,7 @@ do
     make_dir $h/test/perf
     make_dir $h/test/pretty
     make_dir $h/test/doc-tutorial
+    make_dir $h/test/doc-ref
 done
 
 # Configure submodules
index f664f03f7089f76821234cc6e458ebb60628c7f4..ea1698ef2d03ca95440c8a812762afd07e6da2cc 100644 (file)
@@ -424,7 +424,7 @@ across crates; an item's canonical path merely identifies it within the crate.
 
 Two examples of simple paths consisting of only identifier components:
 
-~~~~
+~~~~{.xfail-test}
 x;
 x::y::z;
 ~~~~
@@ -438,7 +438,7 @@ expression context, the final namespace qualifier is omitted.
 
 Two examples of paths with type arguments:
 
-~~~~
+~~~~{.xfail-test}
 type t = map::hashtbl<int,str>;  // Type arguments used in a type expression
 let x = id::<int>(10);           // Type arguments used in a call expression
 ~~~~
@@ -506,7 +506,7 @@ or a *configuration* in Mesa.] A crate file describes:
 
 An example of a crate file:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 // Linkage attributes
 #[ link(name = "projx"
         vers = "2.5",
@@ -627,7 +627,7 @@ of modules making up a crate. Modules can nest arbitrarily.
 
 An example of a module:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 mod math {
     type complex = (f64,f64);
     fn sin(f64) -> f64 {
@@ -680,7 +680,7 @@ attribute is assumed, equal to the `ident` given in the `use_decl`.
 
 Two examples of `use` declarations:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 use pcre (uuid = "54aba0f8-a7b1-4beb-92f1-4cf625264841");
 
 use std; // equivalent to: use std ( name = "std" );
@@ -718,7 +718,7 @@ Imports support a number of "convenience" notations:
 
 An example of imports:
 
-~~~~
+~~~~{.xfail-test}
 import foo = core::info;
 import std::math::sin;
 import std::str::{char_at, hash};
@@ -753,7 +753,7 @@ declaration replaces the default export with the export specified.
 
 An example of an export:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 mod foo {
     export primary;
 
@@ -775,7 +775,7 @@ fn main() {
 
 Multiple names may be exported from a single export declaration:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 mod foo {
     export primary, secondary;
 
@@ -797,7 +797,7 @@ mod foo {
 When exporting the name of an `enum` type `t`, by default, the module also
 implicitly exports all of `t`'s constructors. For example:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 mod foo {
     export t;
     
@@ -815,7 +815,7 @@ constructors, achieving a simple kind of data abstraction. The third
 form exports an `enum` type name along with a subset of its
 constructors. For example:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 mod foo {
     export abstract{};
     export slightly_abstract{a, b};
@@ -883,7 +883,7 @@ with a [`ret`](#return-expressions) or diverging expression. So, if `my_err`
 were declared without the `!` annotation, the following code would not
 typecheck:
 
-~~~~
+~~~~{.xfail-test}
 fn f(i: int) -> int {
    if i == 42 {
      ret 42;
@@ -923,7 +923,7 @@ pure fn lt_42(x: int) -> bool {
 A non-boolean function may also be declared with `pure fn`. This allows
 predicates to call non-boolean functions as long as they are pure. For example:
 
-~~~~
+~~~~{.xfail-test}
 pure fn pure_length<T>(ls: list<T>) -> uint { /* ... */ }
 
 pure fn nonempty_list<T>(ls: list<T>) -> bool { pure_length(ls) > 0u }
@@ -953,7 +953,7 @@ verify the semantics of the predicates they write.
 
 An example of a predicate that uses an unchecked block:
 
-~~~~
+~~~~{.xfail-test}
 fn pure_foldl<T, U: copy>(ls: list<T>, u: U, f: block(&T, &U) -> U) -> U {
     alt ls {
       nil. { u }
@@ -982,7 +982,7 @@ appear in its signature. Each type parameter must be explicitly
 declared, in an angle-bracket-enclosed, comma-separated list following
 the function name.
 
-~~~~
+~~~~{.xfail-test}
 fn iter<T>(seq: [T], f: block(T)) {
     for elt: T in seq { f(elt); }
 }
@@ -1031,7 +1031,7 @@ crust fn new_vec() -> [int] { [] }
 Crust functions may not be called from Rust code, but their value
 may be taken as an unsafe `u8` pointer.
 
-~~~
+~~~{.xfail-test}
 let fptr: *u8 = new_vec;
 ~~~
 
@@ -1081,7 +1081,7 @@ type the constructor is a member of. Such recursion has restrictions:
 
 An example of an `enum` item and its use:
 
-~~~~
+~~~~{.xfail-test}
 enum animal {
   dog;
   cat;
@@ -1093,7 +1093,7 @@ a = cat;
 
 An example of a *recursive* `enum` item and its use:
 
-~~~~
+~~~~{.xfail-test}
 enum list<T> {
   nil;
   cons(T, @list<T>);
@@ -1107,7 +1107,7 @@ let a: list<int> = cons(7, @cons(13, @nil));
 _Resources_ are values that have a destructor associated with them. A
 _resource item_ is used to declare resource type and constructor.
 
-~~~~
+~~~~{.xfail-test}
 resource file_descriptor(fd: int) {
     std::os::libc::close(fd);
 }
@@ -1133,7 +1133,7 @@ An _interface item_ describes a set of method types. _[implementation
 items](#implementations)_ can be used to provide implementations of
 those methods for a specific type.
 
-~~~~
+~~~~{.xfail-test}
 iface shape {
     fn draw(surface);
     fn bounding_box() -> bounding_box;
@@ -1149,7 +1149,7 @@ Type parameters can be specified for an interface to make it generic.
 These appear after the name, using the same syntax used in [generic
 functions](#generic-functions).
 
-~~~~
+~~~~{.xfail-test}
 iface seq<T> {
    fn len() -> uint;
    fn elt_at(n: uint) -> T;
@@ -1163,7 +1163,7 @@ interface can be used to instantiate the parameter, and within the
 generic function, the methods of the interface can be called on values
 that have the parameter's type. For example:
 
-~~~~
+~~~~{.xfail-test}
 fn draw_twice<T: shape>(surface: surface, sh: T) {
     sh.draw(surface);
     sh.draw(surface);
@@ -1176,7 +1176,7 @@ interface. Values of this type are created by
 implementation of the given interface is in scope) to the interface
 type.
 
-~~~~
+~~~~{.xfail-test}
 let myshape: shape = mycircle as shape;
 ~~~~
 
@@ -1191,7 +1191,7 @@ instantiate type parameters that are bounded on their interface.
 An _implementation item_ provides an implementation of an
 [interfaces](#interfaces) for a type.
 
-~~~~
+~~~~{.xfail-test}
 type circle = {radius: float, center: point};
 
 impl circle_shape of shape for circle {
@@ -1218,7 +1218,7 @@ statically (as direct calls on the values of the type that the
 implementation targets). In such an implementation, the `of` clause is
 not given, and the name is mandatory.
 
-~~~~
+~~~~{.xfail-test}
 impl uint_loops for uint {
     fn times(f: block(uint)) {
         let i = 0;
@@ -1236,7 +1236,7 @@ from the type parameters taken by the interface it implements. They
 are written after the name of the implementation, or if that is not
 specified, after the `impl` keyword.
 
-~~~~
+~~~~{.xfail-test}
 impl <T> of seq<T> for [T] {
     /* ... */
 }
@@ -1257,7 +1257,7 @@ module describes functions in external, non-Rust libraries. Functions within
 native modules are declared the same as other Rust functions, with the exception
 that they may not have a body and are instead terminated by a semi-colon.
 
-~~~
+~~~{.xfail-test}
 native mod c {
     fn fopen(filename: *c_char, mod: *c_char) -> *FILE;
 }
@@ -1281,7 +1281,7 @@ By default native mods assume that the library they are calling use
 the standard C "cdecl" ABI. Other ABI's may be specified using the `abi`
 attribute as in
 
-~~~
+~~~{.xfail-test}
 // Interface to the Windows API
 #[abi = "stdcall"]
 native mod kernel32 { }
@@ -1325,7 +1325,7 @@ declaration within the entity body.
 
 An example of attributes:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 // A function marked as a unit test
 #[test]
 fn test_foo() {
@@ -1475,7 +1475,7 @@ values.
 
 ~~~~~~~~ {.tuple}
 (0f, 4.5f);
-("a", 4u, true)
+("a", 4u, true);
 ~~~~~~~~
 
 ### Record expressions
@@ -1578,7 +1578,7 @@ Indices are zero-based, and may be of any integral type. Vector access
 is bounds-checked at run-time. When the check fails, it will put the
 task in a _failing state_.
 
-~~~~
+~~~~{.xfail-test}
 [1, 2, 3, 4][0];
 [mutable 'x', 'y'][1] = 'z';
 ["a", "b"][10]; // fails
@@ -1696,7 +1696,7 @@ is unsupported and will fail to compile.
 
 An example of an `as` expression:
 
-~~~~
+~~~~{.xfail-test}
 fn avg(v: [float]) -> float {
   let sum: float = sum(v);
   let sz: float = std::vec::len(v) as float;
@@ -1727,7 +1727,7 @@ expression. No allocation or destruction is entailed.
 
 An example of three different move expressions:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 x <- a;
 x[i] <- b;
 x.y <- c;
@@ -1749,7 +1749,7 @@ expression. No allocation or destruction is entailed.
 
 An example of three different swap expressions:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 x <-> a;
 x[i] <-> b[i];
 x.y <-> a.b;
@@ -1766,7 +1766,7 @@ expression](#binary-move-expressions) applied to a [unary copy
 expression](#unary-copy-expressions). For example, the following two
 expressions have the same effect:
 
-~~~~
+~~~~{.xfail-test}
 x = y
 x <- copy y
 ~~~~
@@ -1871,7 +1871,7 @@ typestates propagate through function boundaries.
 
 An example of a call expression:
 
-~~~~
+~~~~{.xfail-test}
 let x: int = add(1, 2);
 ~~~~
 
@@ -1894,7 +1894,7 @@ and residual arguments that was specified during the binding.
 
 An example of a `bind` expression:
 
-~~~~
+~~~~{.xfail-test}
 fn add(x: int, y: int) -> int {
     ret x + y;
 }
@@ -1949,7 +1949,7 @@ loop body. If it evaluates to `false`, control exits the loop.
 
 An example of a simple `while` expression:
 
-~~~~
+~~~~{.xfail-test}
 while i < 10 {
     print("hello\n");
     i = i + 1;
@@ -1958,7 +1958,7 @@ while i < 10 {
 
 An example of a `do`-`while` expression:
 
-~~~~
+~~~~{.xfail-test}
 do {
     print("hello\n");
     i = i + 1;
@@ -2035,7 +2035,7 @@ elements of the underlying sequence, one iteration per sequence element.
 
 An example a for loop:
 
-~~~~
+~~~~{.xfail-test}
 let v: [foo] = [a, b, c];
 
 for e: foo in v {
@@ -2093,7 +2093,7 @@ variables in the arm's block, and control enters the block.
 An example of an `alt` expression:
 
 
-~~~~
+~~~~{.xfail-test}
 enum list<X> { nil; cons(X, @list<X>); }
 
 let x: list<int> = cons(10, @cons(11, @nil));
@@ -2118,7 +2118,7 @@ Records can also be pattern-matched and their fields bound to variables.
 When matching fields of a record, the fields being matched are specified
 first, then a placeholder (`_`) represents the remaining fields.
 
-~~~~
+~~~~{.xfail-test}
 fn main() {
     let r = {
         player: "ralph",
@@ -2146,7 +2146,7 @@ fn main() {
 Multiple alternative patterns may be joined with the `|` operator.  A
 range of values may be specified with `to`.  For example:
 
-~~~~
+~~~~{.xfail-test}
 let message = alt x {
   0 | 1  { "not many" }
   2 to 9 { "a few" }
@@ -2159,7 +2159,7 @@ criteria for matching a case. Pattern guards appear after the pattern and
 consist of a bool-typed expression following the `if` keyword. A pattern
 guard may refer to the variables bound within the pattern they follow.
 
-~~~~
+~~~~{.xfail-test}
 let message = alt maybe_digit {
   some(x) if x < 10 { process_digit(x) }
   some(x) { process_other(x) }
@@ -2203,7 +2203,7 @@ the `note` to the internal logging diagnostic buffer.
 
 An example of a `note` expression:
 
-~~~~
+~~~~{.xfail-test}
 fn read_file_lines(path: str) -> [str] {
     note path;
     let r: [str];
@@ -2276,7 +2276,7 @@ syntax-extension.
 The following examples all produce the same output, logged at the `error`
 logging level:
 
-~~~~
+~~~~{.xfail-test}
 // Full version, logging a value.
 log(core::error, "file not found: " + filename);
 
@@ -2327,7 +2327,7 @@ itself. From there, the typestate algorithm can perform dataflow calculations
 on subsequent expressions, propagating [conditions](#conditions) forward and
 statically comparing implied states and their specifications.
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 pure fn even(x: int) -> bool {
     ret x & 1 == 0;
 }
@@ -2392,14 +2392,14 @@ following two examples are equivalent:
 
 Example using `check`:
 
-~~~~
+~~~~{.xfail-test}
 check even(x);
 print_even(x);
 ~~~~
 
 Equivalent example using `if check`:
 
-~~~~
+~~~~{.xfail-test}
 if check even(x) {
     print_even(x);
 } else {
@@ -2455,7 +2455,7 @@ second-class Rust concepts that are present in syntax. The arguments to
 `macro` are pairs (two-element vectors). The pairs consist of an invocation
 and the syntax to expand into. An example:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 #macro([#apply[fn, [args, ...]], fn(args, ...)]);
 ~~~~~~~~
 
@@ -2474,7 +2474,7 @@ matched, and where the repeated output must be transcribed. A more
 sophisticated example:
 
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 #macro([#zip_literals[[x, ...], [y, ...]), [[x, y], ...]]);
 #macro([#unzip_literals[[x, y], ...], [[x, ...], [y, ...]]]);
 ~~~~~~~~
@@ -2611,7 +2611,7 @@ order specified by the tuple type.
 
 An example of a tuple type and its use:
 
-~~~~
+~~~~{.xfail-test}
 type pair = (int,str);
 let p: pair = (10,"hello");
 let (a, b) = p;
@@ -2638,7 +2638,7 @@ behaviour supports idiomatic in-place "growth" of a mutable slot holding a
 vector:
 
 
-~~~~
+~~~~{.xfail-test}
 let v: mutable [int] = [1, 2, 3];
 v += [4, 5, 6];
 ~~~~
@@ -2693,7 +2693,7 @@ consists of a sequence of input slots, an optional set of
 
 An example of a `fn` type:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 fn add(x: int, y: int) -> int {
   ret x + y;
 }
@@ -2735,7 +2735,7 @@ that value to be of copyable kind. Type parameter types are assumed to
 be noncopyable, unless one of the special bounds `send` or `copy` is
 declared for it. For example, this is not a valid program:
 
-~~~~
+~~~~{.xfail-test}
 fn box<T>(x: T) -> @T { @x }
 ~~~~
 
@@ -2776,7 +2776,7 @@ has a set of points before and after it in the implied control flow.
 
 For example, this code:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
  s = "hello, world";
  print(s);
 ~~~~~~~~
@@ -2801,8 +2801,8 @@ Consists of 2 statements, 3 expressions and 12 points:
 Whereas this code:
 
 
-~~~~~~~~
- print(x() + y());
+~~~~~~~~{.xfail-test}
+print(x() + y());
 ~~~~~~~~
 
 Consists of 1 statement, 7 expressions and 14 points:
@@ -3106,7 +3106,7 @@ dereference} operations are:
 
 An example of an implicit-dereference operation performed on box values:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 let x: @int = @10;
 let y: @int = @12;
 assert (x + y == 22);
@@ -3280,7 +3280,7 @@ The result of a `spawn` call is a `core::task::task` value.
 
 An example of a `spawn` call:
 
-~~~~
+~~~~{.xfail-test}
 import task::*;
 import comm::*;
 
@@ -3305,7 +3305,7 @@ channel's outgoing buffer.
 
 An example of a send:
 
-~~~~
+~~~~{.xfail-test}
 import comm::*;
 let c: chan<str> = ...;
 send(c, "hello, world");
@@ -3321,7 +3321,7 @@ time the port deques a value to return, and un-blocks the receiving task.
 
 An example of a *receive*:
 
-~~~~~~~~
+~~~~~~~~{.xfail-test}
 import comm::*;
 let p: port<str> = ...;
 let s = recv(p);
index 37b7f297cc8bcd0644f73bbe72b624bbec2ea67e..2f3db5d919088c2a94956b08c5966af37b9d1534 100644 (file)
@@ -113,6 +113,11 @@ doc-tutorial-extract$(1):
        $$(Q)rm -f $(1)/test/doc-tutorial/*.rs
        $$(Q)$$(EXTRACT_TESTS) $$(S)doc/tutorial.md $(1)/test/doc-tutorial
 
+doc-ref-extract$(1):
+       @$$(call E, extract: ref tests)
+       $$(Q)rm -f $(1)/test/doc-ref/*.rs
+       $$(Q)$$(EXTRACT_TESTS) $$(S)doc/rust.md $(1)/test/doc-ref
+
 endef
 
 $(foreach host,$(CFG_TARGET_TRIPLES), \
@@ -141,7 +146,8 @@ check-stage$(1)-T-$(2)-H-$(3): tidy                         \
        check-stage$(1)-T-$(2)-H-$(3)-bench                     \
        check-stage$(1)-T-$(2)-H-$(3)-pretty                    \
         check-stage$(1)-T-$(2)-H-$(3)-rustdoc                   \
-        check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial
+        check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial              \
+        check-stage$(1)-T-$(2)-H-$(3)-doc-ref
 
 check-stage$(1)-T-$(2)-H-$(3)-core:                            \
        check-stage$(1)-T-$(2)-H-$(3)-core-dummy
@@ -191,6 +197,9 @@ check-stage$(1)-T-$(2)-H-$(3)-rustdoc:                              \
 check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial: \
        check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial-dummy
 
+check-stage$(1)-T-$(2)-H-$(3)-doc-ref: \
+       check-stage$(1)-T-$(2)-H-$(3)-doc-ref-dummy
+
 # Rules for the core library test runner
 
 $(3)/test/coretest.stage$(1)-$(2)$$(X):                        \
@@ -323,6 +332,12 @@ DOC_TUTORIAL_ARGS$(1)-T-$(2)-H-$(3) :=                     \
         --build-base $(3)/test/doc-tutorial/           \
         --mode run-pass
 
+DOC_REF_ARGS$(1)-T-$(2)-H-$(3) :=                      \
+               $$(CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3)) \
+        --src-base $(3)/test/doc-ref/                  \
+        --build-base $(3)/test/doc-ref/                        \
+        --mode run-pass
+
 check-stage$(1)-T-$(2)-H-$(3)-cfail-dummy:             \
                $$(HBIN$(1)_H_$(3))/compiletest$$(X)    \
                $$(SREQ$(1)_T_$(2)_H_$(3))              \
@@ -403,6 +418,14 @@ check-stage$(1)-T-$(2)-H-$(3)-doc-tutorial-dummy:       \
        $$(Q)$$(call CFG_RUN_CTEST,$(1),$$<,$(3)) \
                 $$(DOC_TUTORIAL_ARGS$(1)-T-$(2)-H-$(3))
 
+check-stage$(1)-T-$(2)-H-$(3)-doc-ref-dummy:            \
+               $$(HBIN$(1)_H_$(3))/compiletest$$(X)    \
+               $$(SREQ$(1)_T_$(2)_H_$(3))              \
+                doc-ref-extract$(3)
+       @$$(call E, run doc-ref: $$<)
+       $$(Q)$$(call CFG_RUN_CTEST,$(1),$$<,$(3)) \
+                $$(DOC_REF_ARGS$(1)-T-$(2)-H-$(3))
+
 endef
 
 # Instantiate the template for stage 0, 1, 2, 3
@@ -512,6 +535,9 @@ check-stage$(1)-H-$(2)-rustdoc:                                     \
 check-stage$(1)-H-$(2)-doc-tutorial:                           \
        $$(foreach target,$$(CFG_TARGET_TRIPLES),       \
         check-stage$(1)-T-$$(target)-H-$(2)-doc-tutorial)
+check-stage$(1)-H-$(2)-doc-ref:                                \
+       $$(foreach target,$$(CFG_TARGET_TRIPLES),       \
+        check-stage$(1)-T-$$(target)-H-$(2)-doc-ref)
 
 endef
 
@@ -578,6 +604,9 @@ check-stage$(1)-H-all-rustdoc: \
 check-stage$(1)-H-all-doc-tutorial: \
        $$(foreach target,$$(CFG_TARGET_TRIPLES),       \
         check-stage$(1)-H-$$(target)-doc-tutorial)
+check-stage$(1)-H-all-doc-ref: \
+       $$(foreach target,$$(CFG_TARGET_TRIPLES),       \
+        check-stage$(1)-H-$$(target)-doc-ref)
 
 endef
 
@@ -602,6 +631,7 @@ check-stage$(1)-pretty-bench: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-bench
 check-stage$(1)-pretty-pretty: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-pretty-pretty
 check-stage$(1)-rustdoc: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-rustdoc
 check-stage$(1)-doc-tutorial: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-doc-tutorial
+check-stage$(1)-doc-ref: check-stage$(1)-H-$$(CFG_HOST_TRIPLE)-doc-ref
 
 endef
 
index e95c6680f999bc3ca4fb327ed38657cef89e8b3b..e3a9c68c02e5b0c6d6d93821e00eb3a7a96640c2 100644 (file)
@@ -34,6 +34,12 @@ while cur < len(lines):
         tags = re.findall("\.([\w-]*)", line)
         block = ""
         ignore = "notrust" in tags or "ignore" in tags
+        # Some tags used by the language ref that indicate not rust
+        ignore |= "ebnf" in tags
+        ignore |= "abnf" in tags
+        ignore |= "keyword" in tags
+        ignore |= "field" in tags
+        ignore |= "precedence" in tags
         xfail = "xfail-test" in tags
         while cur < len(lines):
             line = lines[cur]