Skip to content

Rollup 2014 12 03 #19507

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 68 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
ddb7718
impl Clone for Cow
Nov 27, 2014
44abe92
small doc fixes
steveklabnik Nov 27, 2014
1c2aef3
RFC 248? I think you meant RFC 438.
chris-morgan Nov 28, 2014
a74b492
fix expand_quote_ty function as parse_ty was changed and needs no arg…
jauhien Nov 29, 2014
9460d17
Fix typo in reference.md
kulakowski Nov 29, 2014
f5715f7
Allow trailing commas in array patterns and attributes
ftxqxd Nov 30, 2014
5048953
Simplify `RefCell` code a bit, make `deref` a no-op.
tbu- Nov 29, 2014
72c96ba
std: Remove implicit shrinking from hash_map.
pczarn Nov 17, 2014
b82624b
std: Change the behavior of `reserve` for HashMap.
pczarn Nov 8, 2014
6687b2a
std: add tests for the Vec<u8> Writer impl
erickt Nov 15, 2014
0d24780
std: add Reader impl for &[u8]
erickt Dec 1, 2014
6716746
Link regions in `ref` bindings from fn arguments.
nikomatsakis Dec 2, 2014
e5c90d4
trans: Remove is_lang_item from base::invoke
reem Dec 2, 2014
5bbe5d6
better wording
MatejLach Dec 2, 2014
ebf22cb
replace 'but' with 'and'
MatejLach Dec 2, 2014
6182084
Improve documentation of checked_* functions
victorvde Dec 2, 2014
d8c5269
Update comment to current file path for intrinsics
victorvde Dec 2, 2014
886ff4f
lldb: Fix pretty printer for nullable-opt enums with fat pointers.
luqmana Dec 2, 2014
ebc4254
Test for associated types ICE
nrc Dec 2, 2014
89d0995
gdb: Fix pretty printer for nullable-opt enums with fat pointers.
luqmana Dec 2, 2014
02fcd95
Utilize fewer reexports
frewsxcv Nov 28, 2014
b258de7
libcore: add `Rhs` input parameter to comparison traits
Nov 20, 2014
2578de9
Test PartialEq multidispatch
Nov 21, 2014
851c7b5
Fixed out of date comment on `copy_memory`
Dec 3, 2014
fc40c0c
libstd: io::fs::File::stat() need not to take &mut self.
nodakai Nov 25, 2014
e7e2d7a
libstd: explicitly disallow io::fs::File to open a directory.
nodakai Dec 2, 2014
588a80d
Move various data structures out of typeck and into ty.
nikomatsakis Nov 25, 2014
e410cb6
Move infer out of `middle::typeck` and into just `middle`.
nikomatsakis Nov 25, 2014
cecc5cf
Remove dependency on typeck from lint.
nikomatsakis Nov 26, 2014
de8f9d1
Remove dependence on typeck from ppaux.
nikomatsakis Nov 26, 2014
44ade07
Remove "dependence" on typeck from comment in substs.
nikomatsakis Nov 26, 2014
8f66d7e
Remove one dependence on typeck from const_eval.
nikomatsakis Nov 26, 2014
5bc7543
Move `typeck` logically in the module tree out to the root and clamp
nikomatsakis Nov 26, 2014
19b489e
Modify libsyntax/diagnostics to not be so persnickety. The scheme
nikomatsakis Nov 27, 2014
2840d58
Overload the `==` operator
Nov 21, 2014
b32b24d
Replace `equiv` method calls with `==` operator sugar
Nov 21, 2014
eac635d
Remove unused transmutes from tests
Nov 23, 2014
09707d7
Fix fallout
Nov 21, 2014
5cfac94
Deprecate Equiv
Nov 27, 2014
51b7b9f
Remove dependencies on driver from trans et al. by moving various
nikomatsakis Nov 27, 2014
fa96442
Move typeck into its own crate.
nikomatsakis Nov 26, 2014
310255c
Separate the driver into its own crate that uses trans, typeck.
nikomatsakis Nov 27, 2014
39eed46
FIXME(#19497) -- Stop messing around and just give rustc 32MB of stac…
nikomatsakis Dec 3, 2014
c200ae5
Remove feature gates for `if let`, `while let`, and tuple indexing
nrc Dec 2, 2014
2e1a501
syntax: support ES6-style unicode escapes
emberian Dec 3, 2014
f85ef15
rollup merge of #18770: pczarn/hash_map-explicit-shrinking
emberian Dec 3, 2014
9afa5b7
rollup merge of #18980: erickt/reader
emberian Dec 3, 2014
9d5ff05
rollup merge of #19167: japaric/rhs-cmp
emberian Dec 3, 2014
14b2f51
rollup merge of #19303: nodakai/libsyntax-reject-dirs
emberian Dec 3, 2014
0c6c274
rollup merge of #19359: japaric/clone-cow
emberian Dec 3, 2014
66ac7f9
rollup merge of #19362: nikomatsakis/crateification
emberian Dec 3, 2014
22f9411
rollup merge of #19364: steveklabnik/doc_buffered_reader
emberian Dec 3, 2014
1c718dc
rollup merge of #19385: chris-morgan/rfc-248-is-actually-438
emberian Dec 3, 2014
232b52f
rollup merge of #19386: tbu-/pr_refcell_stuff
emberian Dec 3, 2014
5503158
rollup merge of #19387: jauhien/fix-expand_quote_ty
emberian Dec 3, 2014
7f2009f
rollup merge of #19396: kulakowski/patch-1
emberian Dec 3, 2014
79fd66e
rollup merge of #19407: frewsxcv/rm-reexports
emberian Dec 3, 2014
aca3396
rollup merge of #19413: P1start/more-trailing-commas
emberian Dec 3, 2014
3a5d1a1
rollup merge of #19456: nikomatsakis/reborrow-closure-arg
emberian Dec 3, 2014
c97d1c7
rollup merge of #19457: reem/remove-is-lang-item
emberian Dec 3, 2014
4ab84cd
rollup merge of #19458: MatejLach/guess_style_fix_guide
emberian Dec 3, 2014
5c840ae
rollup merge of #19462: MatejLach/but-and_guide
emberian Dec 3, 2014
b795e37
rollup merge of #19468: victorvde/master
emberian Dec 3, 2014
f91a4bc
rollup merge of #19472: nick29581/iflet
emberian Dec 3, 2014
515cd5c
rollup merge of #19474: luqmana/fl
emberian Dec 3, 2014
b3a15aa
rollup merge of #19478: nick29581/assoc-ice-test
emberian Dec 3, 2014
68524ab
rollup merge of #19480: cmr/es6-escape
emberian Dec 3, 2014
be38df9
rollup merge of #19483: cgaebel/copy_memory-comment
emberian Dec 3, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions mk/crates.mk
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ TARGET_CRATES := libc std flate arena term \
serialize getopts collections test time rand \
log regex graphviz core rbml alloc rustrt \
unicode
HOST_CRATES := syntax rustc rustc_trans rustdoc regex_macros fmt_macros \
rustc_llvm rustc_back
RUSTC_CRATES := rustc rustc_typeck rustc_driver rustc_trans rustc_back rustc_llvm
HOST_CRATES := syntax $(RUSTC_CRATES) rustdoc regex_macros fmt_macros
CRATES := $(TARGET_CRATES) $(HOST_CRATES)
TOOLS := compiletest rustdoc rustc

Expand All @@ -67,12 +67,16 @@ DEPS_std := core libc rand alloc collections rustrt unicode \
native:rust_builtin native:backtrace
DEPS_graphviz := std
DEPS_syntax := std term serialize log fmt_macros arena libc
DEPS_rustc_trans := rustc rustc_back rustc_llvm libc
DEPS_rustc_driver := arena flate getopts graphviz libc rustc rustc_back \
rustc_typeck log syntax serialize rustc_llvm rustc_trans
DEPS_rustc_trans := arena flate getopts graphviz libc rustc rustc_back \
log syntax serialize rustc_llvm
DEPS_rustc_typeck := rustc syntax
DEPS_rustc := syntax flate arena serialize getopts rbml \
time log graphviz rustc_llvm rustc_back
DEPS_rustc_llvm := native:rustllvm libc std
DEPS_rustc_back := std syntax rustc_llvm flate log libc
DEPS_rustdoc := rustc rustc_trans native:hoedown serialize getopts \
DEPS_rustdoc := rustc rustc_driver native:hoedown serialize getopts \
test time
DEPS_flate := std native:miniz
DEPS_arena := std
Expand All @@ -94,7 +98,7 @@ DEPS_fmt_macros = std

TOOL_DEPS_compiletest := test getopts
TOOL_DEPS_rustdoc := rustdoc
TOOL_DEPS_rustc := rustc_trans
TOOL_DEPS_rustc := rustc_driver
TOOL_SOURCE_compiletest := $(S)src/compiletest/compiletest.rs
TOOL_SOURCE_rustdoc := $(S)src/driver/driver.rs
TOOL_SOURCE_rustc := $(S)src/driver/driver.rs
Expand All @@ -110,8 +114,12 @@ ONLY_RLIB_unicode := 1
# You should not need to edit below this line
################################################################################

DOC_CRATES := $(filter-out rustc, $(filter-out rustc_trans, $(filter-out syntax, $(CRATES))))
COMPILER_DOC_CRATES := rustc rustc_trans syntax
DOC_CRATES := $(filter-out rustc, \
$(filter-out rustc_trans, \
$(filter-out rustc_typeck, \
$(filter-out rustc_driver, \
$(filter-out syntax, $(CRATES))))))
COMPILER_DOC_CRATES := rustc rustc_trans rustc_typeck rustc_driver syntax

# This macro creates some simple definitions for each crate being built, just
# some munging of all of the parameters above.
Expand Down
6 changes: 3 additions & 3 deletions src/doc/guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -2064,8 +2064,8 @@ Great! Next up: let's compare our guess to the secret guess.
## Comparing guesses

If you remember, earlier in the guide, we made a `cmp` function that compared
two numbers. Let's add that in, along with a `match` statement to compare the
guess to the secret guess:
two numbers. Let's add that in, along with a `match` statement to compare our
guess to the secret number:

```{rust,ignore}
use std::io;
Expand Down Expand Up @@ -2861,7 +2861,7 @@ parts of your library. The six levels are:
* experimental: This item was only recently introduced or is otherwise in a
state of flux. It may change significantly, or even be removed. No guarantee
of backwards-compatibility.
* unstable: This item is still under development, but requires more testing to
* unstable: This item is still under development and requires more testing to
be considered stable. No guarantee of backwards-compatibility.
* stable: This item is considered stable, and will not change significantly.
Guarantee of backwards-compatibility.
Expand Down
8 changes: 4 additions & 4 deletions src/doc/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ The two values of the boolean type are written `true` and `false`.
### Symbols

```{.ebnf .gram}
symbol : "::" "->"
symbol : "::" | "->"
| '#' | '[' | ']' | '(' | ')' | '{' | '}'
| ',' | ';' ;
```
Expand Down Expand Up @@ -994,7 +994,7 @@ An example of `use` declarations:

```
use std::iter::range_step;
use std::option::{Some, None};
use std::option::Option::{Some, None};
use std::collections::hash_map::{mod, HashMap};

fn foo<T>(_: T){}
Expand All @@ -1004,8 +1004,8 @@ fn main() {
// Equivalent to 'std::iter::range_step(0u, 10u, 2u);'
range_step(0u, 10u, 2u);

// Equivalent to 'foo(vec![std::option::Some(1.0f64),
// std::option::None]);'
// Equivalent to 'foo(vec![std::option::Option::Some(1.0f64),
// std::option::Option::None]);'
foo(vec![Some(1.0f64), None]);

// Both `hash_map` and `HashMap` are in scope.
Expand Down
2 changes: 1 addition & 1 deletion src/driver/driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
extern crate "rustdoc" as this;

#[cfg(rustc)]
extern crate "rustc_trans" as this;
extern crate "rustc_driver" as this;

fn main() { this::main() }
16 changes: 11 additions & 5 deletions src/etc/gdb_rust_pretty_printing.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,21 +54,27 @@ def rust_pretty_printer_lookup_function(val):
return RustStructPrinter(val, false)

if enum_member_count == 1:
if enum_members[0].name == None:
first_variant_name = enum_members[0].name
if first_variant_name == None:
# This is a singleton enum
return rust_pretty_printer_lookup_function(val[enum_members[0]])
else:
assert enum_members[0].name.startswith("RUST$ENCODED$ENUM$")
assert first_variant_name.startswith("RUST$ENCODED$ENUM$")
# This is a space-optimized enum
last_separator_index = enum_members[0].name.rfind("$")
last_separator_index = first_variant_name.rfind("$")
second_last_separator_index = first_variant_name.rfind("$", 0, last_separator_index)
disr_field_index = first_variant_name[second_last_separator_index + 1 :
last_separator_index]
disr_field_index = int(disr_field_index)

sole_variant_val = val[enum_members[0]]
disr_field = get_field_at_index(sole_variant_val, disr_field_index)
discriminant = int(sole_variant_val[disr_field])
discriminant = sole_variant_val[disr_field]

# If the discriminant field is a fat pointer we have to consider the
# first word as the true discriminant
if discriminant.type.code == gdb.TYPE_CODE_STRUCT:
discriminant = discriminant[get_field_at_index(discriminant, 0)]

if discriminant == 0:
null_variant_name = first_variant_name[last_separator_index + 1:]
Expand Down Expand Up @@ -173,7 +179,7 @@ def to_string(self):

class IdentityPrinter:
def __init__(self, string):
self.string
self.string = string

def to_string(self):
return self.string
Expand Down
9 changes: 7 additions & 2 deletions src/etc/lldb_rust_formatters.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,14 @@ def print_enum_val(val, internal_dict):
return "<invalid enum encoding: %s>" % first_variant_name

# Read the discriminant
disr_val = val.GetChildAtIndex(0).GetChildAtIndex(disr_field_index).GetValueAsUnsigned()
disr_val = val.GetChildAtIndex(0).GetChildAtIndex(disr_field_index)

if disr_val == 0:
# If the discriminant field is a fat pointer we have to consider the
# first word as the true discriminant
if disr_val.GetType().GetTypeClass() == lldb.eTypeClassStruct:
disr_val = disr_val.GetChildAtIndex(0)

if disr_val.GetValueAsUnsigned() == 0:
# Null case: Print the name of the null-variant
null_variant_name = first_variant_name[last_separator_index + 1:]
return null_variant_name
Expand Down
16 changes: 9 additions & 7 deletions src/etc/unicode.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ def escape_char(c):
def emit_bsearch_range_table(f):
f.write("""
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
use core::cmp::{Equal, Less, Greater};
use core::cmp::Ordering::{Equal, Less, Greater};
use core::slice::SlicePrelude;
r.binary_search(|&(lo,hi)| {
if lo <= c && c <= hi { Equal }
Expand Down Expand Up @@ -350,10 +350,11 @@ def emit_regex_module(f, cats, w_data):
def emit_conversions_module(f, lowerupper, upperlower):
f.write("pub mod conversions {")
f.write("""
use core::cmp::{Equal, Less, Greater};
use core::cmp::Ordering::{Equal, Less, Greater};
use core::slice::SlicePrelude;
use core::tuple::Tuple2;
use core::option::{Option, Some, None};
use core::option::Option;
use core::option::Option::{Some, None};
use core::slice;

pub fn to_lower(c: char) -> char {
Expand Down Expand Up @@ -403,7 +404,7 @@ def emit_grapheme_module(f, grapheme_table, grapheme_cats):
f.write(""" }

fn bsearch_range_value_table(c: char, r: &'static [(char, char, GraphemeCat)]) -> GraphemeCat {
use core::cmp::{Equal, Less, Greater};
use core::cmp::Ordering::{Equal, Less, Greater};
match r.binary_search(|&(lo, hi, _)| {
if lo <= c && c <= hi { Equal }
else if hi < c { Less }
Expand All @@ -430,12 +431,13 @@ def emit_grapheme_module(f, grapheme_table, grapheme_cats):

def emit_charwidth_module(f, width_table):
f.write("pub mod charwidth {\n")
f.write(" use core::option::{Option, Some, None};\n")
f.write(" use core::option::Option;\n")
f.write(" use core::option::Option::{Some, None};\n")
f.write(" use core::slice::SlicePrelude;\n")
f.write(" use core::slice;\n")
f.write("""
fn bsearch_range_value_table(c: char, is_cjk: bool, r: &'static [(char, char, u8, u8)]) -> u8 {
use core::cmp::{Equal, Less, Greater};
use core::cmp::Ordering::{Equal, Less, Greater};
match r.binary_search(|&(lo, hi, _, _)| {
if lo <= c && c <= hi { Equal }
else if hi < c { Less }
Expand Down Expand Up @@ -530,7 +532,7 @@ def comp_pfun(char):

f.write("""
fn bsearch_range_value_table(c: char, r: &'static [(char, char, u8)]) -> u8 {
use core::cmp::{Equal, Less, Greater};
use core::cmp::Ordering::{Equal, Less, Greater};
use core::slice::SlicePrelude;
use core::slice;
match r.binary_search(|&(lo, hi, _)| {
Expand Down
6 changes: 4 additions & 2 deletions src/liballoc/arc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ use core::kinds::{Sync, Send};
use core::mem::{min_align_of, size_of, drop};
use core::mem;
use core::ops::{Drop, Deref};
use core::option::{Some, None, Option};
use core::option::Option;
use core::option::Option::{Some, None};
use core::ptr::RawPtr;
use core::ptr;
use heap::deallocate;
Expand Down Expand Up @@ -326,7 +327,8 @@ mod tests {
use std::comm::channel;
use std::mem::drop;
use std::ops::Drop;
use std::option::{Option, Some, None};
use std::option::Option;
use std::option::Option::{Some, None};
use std::str::Str;
use std::sync::atomic;
use std::task;
Expand Down
3 changes: 2 additions & 1 deletion src/liballoc/boxed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ use core::kinds::Sized;
use core::mem;
use core::option::Option;
use core::raw::TraitObject;
use core::result::{Ok, Err, Result};
use core::result::Result;
use core::result::Result::{Ok, Err};

/// A value that represents the global exchange heap. This is the default
/// place that the `box` keyword allocates into when no place is supplied.
Expand Down
3 changes: 2 additions & 1 deletion src/liballoc/heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,8 @@ const MIN_ALIGN: uint = 16;

#[cfg(jemalloc)]
mod imp {
use core::option::{None, Option};
use core::option::Option;
use core::option::Option::None;
use core::ptr::{null_mut, null};
use core::num::Int;
use libc::{c_char, c_int, c_void, size_t};
Expand Down
11 changes: 7 additions & 4 deletions src/liballoc/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,12 @@ use core::fmt;
use core::kinds::marker;
use core::mem::{transmute, min_align_of, size_of, forget};
use core::ops::{Deref, Drop};
use core::option::{Option, Some, None};
use core::option::Option;
use core::option::Option::{Some, None};
use core::ptr;
use core::ptr::RawPtr;
use core::result::{Result, Ok, Err};
use core::result::Result;
use core::result::Result::{Ok, Err};

use heap::deallocate;

Expand Down Expand Up @@ -739,8 +741,9 @@ impl<T> RcBoxPtr<T> for Weak<T> {
mod tests {
use super::{Rc, Weak, weak_count, strong_count};
use std::cell::RefCell;
use std::option::{Option, Some, None};
use std::result::{Err, Ok};
use std::option::Option;
use std::option::Option::{Some, None};
use std::result::Result::{Err, Ok};
use std::mem::drop;
use std::clone::Clone;

Expand Down
4 changes: 2 additions & 2 deletions src/libcollections/dlist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -945,15 +945,15 @@ mod tests {
let mut m = list_from(v.as_slice());
m.rotate_backward(); check_links(&m);
m.rotate_forward(); check_links(&m);
assert_eq!(v.iter().collect::<Vec<&int>>(), m.iter().collect());
assert_eq!(v.iter().collect::<Vec<&int>>(), m.iter().collect::<Vec<_>>());
m.rotate_forward(); check_links(&m);
m.rotate_forward(); check_links(&m);
m.pop_front(); check_links(&m);
m.rotate_forward(); check_links(&m);
m.rotate_backward(); check_links(&m);
m.push_front(9); check_links(&m);
m.rotate_forward(); check_links(&m);
assert_eq!(vec![3i,9,5,1,2], m.into_iter().collect());
assert_eq!(vec![3i,9,5,1,2], m.into_iter().collect::<Vec<_>>());
}

#[test]
Expand Down
24 changes: 12 additions & 12 deletions src/libcollections/enum_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,23 +397,23 @@ mod test {
fn test_iterator() {
let mut e1: EnumSet<Foo> = EnumSet::new();

let elems: Vec<Foo> = e1.iter().collect();
let elems: ::vec::Vec<Foo> = e1.iter().collect();
assert!(elems.is_empty())

e1.insert(A);
let elems = e1.iter().collect();
let elems: ::vec::Vec<_> = e1.iter().collect();
assert_eq!(vec![A], elems)

e1.insert(C);
let elems = e1.iter().collect();
let elems: ::vec::Vec<_> = e1.iter().collect();
assert_eq!(vec![A,C], elems)

e1.insert(C);
let elems = e1.iter().collect();
let elems: ::vec::Vec<_> = e1.iter().collect();
assert_eq!(vec![A,C], elems)

e1.insert(B);
let elems = e1.iter().collect();
let elems: ::vec::Vec<_> = e1.iter().collect();
assert_eq!(vec![A,B,C], elems)
}

Expand All @@ -431,35 +431,35 @@ mod test {
e2.insert(C);

let e_union = e1 | e2;
let elems = e_union.iter().collect();
let elems: ::vec::Vec<_> = e_union.iter().collect();
assert_eq!(vec![A,B,C], elems)

let e_intersection = e1 & e2;
let elems = e_intersection.iter().collect();
let elems: ::vec::Vec<_> = e_intersection.iter().collect();
assert_eq!(vec![C], elems)

// Another way to express intersection
let e_intersection = e1 - (e1 - e2);
let elems = e_intersection.iter().collect();
let elems: ::vec::Vec<_> = e_intersection.iter().collect();
assert_eq!(vec![C], elems)

let e_subtract = e1 - e2;
let elems = e_subtract.iter().collect();
let elems: ::vec::Vec<_> = e_subtract.iter().collect();
assert_eq!(vec![A], elems)

// Bitwise XOR of two sets, aka symmetric difference
let e_symmetric_diff = e1 ^ e2;
let elems = e_symmetric_diff.iter().collect();
let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
assert_eq!(vec![A,B], elems)

// Another way to express symmetric difference
let e_symmetric_diff = (e1 - e2) | (e2 - e1);
let elems = e_symmetric_diff.iter().collect();
let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
assert_eq!(vec![A,B], elems)

// Yet another way to express symmetric difference
let e_symmetric_diff = (e1 | e2) - (e1 & e2);
let elems = e_symmetric_diff.iter().collect();
let elems: ::vec::Vec<_> = e_symmetric_diff.iter().collect();
assert_eq!(vec![A,B], elems)
}

Expand Down
Loading