Skip to content

Commit 6237560

Browse files
committed
---
yaml --- r: 272977 b: refs/heads/beta c: 3e764ef h: refs/heads/master i: 272975: e528058
1 parent ccc906a commit 6237560

File tree

265 files changed

+4254
-2821
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

265 files changed

+4254
-2821
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: 46dc35e4772e892bf1be04fa01767e0ec00ffe2f
26+
refs/heads/beta: 3e764efef73baa69ce3f8643b96aba1a4155b438
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/mk/crates.mk

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,17 @@
4949
# automatically generated for all stage/host/target combinations.
5050
################################################################################
5151

52-
TARGET_CRATES := libc std flate arena term \
53-
serialize getopts collections test rand \
54-
log graphviz core rbml alloc \
52+
TARGET_CRATES := libc std term \
53+
getopts collections test rand \
54+
core alloc \
5555
rustc_unicode rustc_bitflags \
5656
alloc_system alloc_jemalloc
5757
RUSTC_CRATES := rustc rustc_typeck rustc_mir rustc_borrowck rustc_resolve rustc_driver \
5858
rustc_trans rustc_back rustc_llvm rustc_privacy rustc_lint \
5959
rustc_data_structures rustc_front rustc_platform_intrinsics \
6060
rustc_plugin rustc_metadata rustc_passes
61-
HOST_CRATES := syntax syntax_ext $(RUSTC_CRATES) rustdoc fmt_macros
61+
HOST_CRATES := syntax syntax_ext $(RUSTC_CRATES) rustdoc fmt_macros \
62+
flate arena graphviz rbml log serialize
6263
TOOLS := compiletest rustdoc rustc rustbook error_index_generator
6364

6465
DEPS_core :=
@@ -84,10 +85,10 @@ DEPS_log := std
8485
DEPS_num := std
8586
DEPS_rbml := std log serialize
8687
DEPS_serialize := std log
87-
DEPS_term := std log
88-
DEPS_test := std getopts serialize rbml term native:rust_test_helpers
88+
DEPS_term := std
89+
DEPS_test := std getopts term native:rust_test_helpers
8990

90-
DEPS_syntax := std term serialize log arena libc rustc_bitflags
91+
DEPS_syntax := std term serialize log arena libc rustc_bitflags rustc_unicode
9192
DEPS_syntax_ext := syntax fmt_macros
9293

9394
DEPS_rustc := syntax fmt_macros flate arena serialize getopts rbml rustc_front\

branches/beta/mk/tests.mk

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,6 @@ check-stage$(1)-T-$(2)-H-$(3)-exec: \
299299
check-stage$(1)-T-$(2)-H-$(3)-cfail-exec \
300300
check-stage$(1)-T-$(2)-H-$(3)-pfail-exec \
301301
check-stage$(1)-T-$(2)-H-$(3)-rpass-valgrind-exec \
302-
check-stage$(1)-T-$(2)-H-$(3)-rpass-full-exec \
303-
check-stage$(1)-T-$(2)-H-$(3)-rfail-full-exec \
304-
check-stage$(1)-T-$(2)-H-$(3)-cfail-full-exec \
305302
check-stage$(1)-T-$(2)-H-$(3)-rmake-exec \
306303
check-stage$(1)-T-$(2)-H-$(3)-rustdocck-exec \
307304
check-stage$(1)-T-$(2)-H-$(3)-crates-exec \
@@ -317,6 +314,15 @@ check-stage$(1)-T-$(2)-H-$(3)-exec: \
317314
# able to build a compiler (when the target triple is in the set of host triples)
318315
ifneq ($$(findstring $(2),$$(CFG_HOST)),)
319316

317+
check-stage$(1)-T-$(2)-H-$(3)-exec: \
318+
check-stage$(1)-T-$(2)-H-$(3)-rpass-full-exec \
319+
check-stage$(1)-T-$(2)-H-$(3)-rfail-full-exec \
320+
check-stage$(1)-T-$(2)-H-$(3)-cfail-full-exec
321+
322+
check-stage$(1)-T-$(2)-H-$(3)-pretty-exec: \
323+
check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-full-exec \
324+
check-stage$(1)-T-$(2)-H-$(3)-pretty-rfail-full-exec
325+
320326
check-stage$(1)-T-$(2)-H-$(3)-crates-exec: \
321327
$$(foreach crate,$$(TEST_CRATES), \
322328
check-stage$(1)-T-$(2)-H-$(3)-$$(crate)-exec)
@@ -340,9 +346,7 @@ check-stage$(1)-T-$(2)-H-$(3)-doc-exec: \
340346
check-stage$(1)-T-$(2)-H-$(3)-pretty-exec: \
341347
check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-exec \
342348
check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-valgrind-exec \
343-
check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-full-exec \
344349
check-stage$(1)-T-$(2)-H-$(3)-pretty-rfail-exec \
345-
check-stage$(1)-T-$(2)-H-$(3)-pretty-rfail-full-exec \
346350
check-stage$(1)-T-$(2)-H-$(3)-pretty-pretty-exec
347351

348352
endef

branches/beta/src/bootstrap/bootstrap.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ def download_rust_nightly(self):
7373

7474
if self.rustc().startswith(self.bin_root()) and \
7575
(not os.path.exists(self.rustc()) or self.rustc_out_of_date()):
76-
shutil.rmtree(self.bin_root())
76+
if os.path.exists(self.bin_root()):
77+
shutil.rmtree(self.bin_root())
7778
filename = "rust-std-nightly-" + self.build + ".tar.gz"
7879
url = "https://static.rust-lang.org/dist/" + self.snap_rustc_date()
7980
tarball = os.path.join(rustc_cache, filename)

branches/beta/src/bootstrap/build/compile.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,19 @@ pub fn std_link(build: &Build,
8383
libdir.join(staticlib("compiler-rt", target))));
8484
}
8585
add_to_sysroot(&out_dir, &libdir);
86+
87+
if target.contains("musl") && (target.contains("x86_64") || target.contains("i686")) {
88+
copy_third_party_objects(build, target, &libdir);
89+
}
90+
}
91+
92+
/// Copies the crt(1,i,n).o startup objects
93+
///
94+
/// Only required for musl targets that statically link to libc
95+
fn copy_third_party_objects(build: &Build, target: &str, into: &Path) {
96+
for &obj in &["crt1.o", "crti.o", "crtn.o"] {
97+
t!(fs::copy(compiler_file(build.cc(target), obj), into.join(obj)));
98+
}
8699
}
87100

88101
/// Build and prepare startup objects like rsbegin.o and rsend.o

branches/beta/src/bootstrap/build/sanity.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ pub fn check(build: &mut Build) {
7979
}
8080

8181
// Make sure musl-root is valid if specified
82-
if target.contains("musl") && target.contains("x86_64") {
82+
if target.contains("musl") && (target.contains("x86_64") || target.contains("i686")) {
8383
match build.config.musl_root {
8484
Some(ref root) => {
8585
if fs::metadata(root.join("lib/libc.a")).is_err() {

branches/beta/src/doc/book/ownership.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn foo() {
5151
}
5252
```
5353

54-
When `v` comes into scope, a new [vector] is created on [the stack][stack],
54+
When `v` comes into scope, a new [vector][vectors] is created on [the stack][stack],
5555
and it allocates space on [the heap][heap] for its elements. When `v` goes out
5656
of scope at the end of `foo()`, Rust will clean up everything related to the
5757
vector, even the heap-allocated memory. This happens deterministically, at the

branches/beta/src/doc/book/references-and-borrowing.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Before we get to the details, two important notes about the ownership system.
2323
Rust has a focus on safety and speed. It accomplishes these goals through many
2424
‘zero-cost abstractions’, which means that in Rust, abstractions cost as little
2525
as possible in order to make them work. The ownership system is a prime example
26-
of a zero cost abstraction. All of the analysis we’ll talk about in this guide
26+
of a zero-cost abstraction. All of the analysis we’ll talk about in this guide
2727
is _done at compile time_. You do not pay any run-time cost for any of these
2828
features.
2929

branches/beta/src/doc/book/syntax-index.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,23 @@
4343
* `!` (`!expr`): bitwise or logical complement. Overloadable (`Not`).
4444
* `!=` (`var != expr`): nonequality comparison. Overloadable (`PartialEq`).
4545
* `%` (`expr % expr`): arithmetic remainder. Overloadable (`Rem`).
46-
* `%=` (`var %= expr`): arithmetic remainder & assignment.
46+
* `%=` (`var %= expr`): arithmetic remainder & assignment. Overloadable (`RemAssign`).
4747
* `&` (`expr & expr`): bitwise and. Overloadable (`BitAnd`).
4848
* `&` (`&expr`): borrow. See [References and Borrowing].
4949
* `&` (`&type`, `&mut type`, `&'a type`, `&'a mut type`): borrowed pointer type. See [References and Borrowing].
50-
* `&=` (`var &= expr`): bitwise and & assignment.
50+
* `&=` (`var &= expr`): bitwise and & assignment. Overloadable (`BitAndAssign`).
5151
* `&&` (`expr && expr`): logical and.
5252
* `*` (`expr * expr`): arithmetic multiplication. Overloadable (`Mul`).
5353
* `*` (`*expr`): dereference.
5454
* `*` (`*const type`, `*mut type`): raw pointer. See [Raw Pointers].
55-
* `*=` (`var *= expr`): arithmetic multiplication & assignment.
55+
* `*=` (`var *= expr`): arithmetic multiplication & assignment. Overloadable (`MulAssign`).
5656
* `+` (`expr + expr`): arithmetic addition. Overloadable (`Add`).
5757
* `+` (`trait + trait`, `'a + trait`): compound type constraint. See [Traits (Multiple Trait Bounds)].
58-
* `+=` (`var += expr`): arithmetic addition & assignment.
58+
* `+=` (`var += expr`): arithmetic addition & assignment. Overloadable (`AddAssign`).
5959
* `,`: argument and element separator. See [Attributes], [Functions], [Structs], [Generics], [Match], [Closures], [Crates and Modules (Importing Modules with `use`)].
6060
* `-` (`expr - expr`): arithmetic subtraction. Overloadable (`Sub`).
6161
* `-` (`- expr`): arithmetic negation. Overloadable (`Neg`).
62-
* `-=` (`var -= expr`): arithmetic subtraction & assignment.
62+
* `-=` (`var -= expr`): arithmetic subtraction & assignment. Overloadable (`SubAssign`).
6363
* `->` (`fn(…) -> type`, `|…| -> type`): function and closure return type. See [Functions], [Closures].
6464
* `-> !` (`fn(…) -> !`, `|…| -> !`): diverging function or closure. See [Diverging Functions].
6565
* `.` (`expr.ident`): member access. See [Structs], [Method Syntax].
@@ -69,14 +69,14 @@
6969
* `...` (`...expr`, `expr...expr`) *in an expression*: inclusive range expression. See [Iterators].
7070
* `...` (`expr...expr`) *in a pattern*: inclusive range pattern. See [Patterns (Ranges)].
7171
* `/` (`expr / expr`): arithmetic division. Overloadable (`Div`).
72-
* `/=` (`var /= expr`): arithmetic division & assignment.
72+
* `/=` (`var /= expr`): arithmetic division & assignment. Overloadable (`DivAssign`).
7373
* `:` (`pat: type`, `ident: type`): constraints. See [Variable Bindings], [Functions], [Structs], [Traits].
7474
* `:` (`ident: expr`): struct field initializer. See [Structs].
7575
* `:` (`'a: loop {…}`): loop label. See [Loops (Loops Labels)].
7676
* `;`: statement and item terminator.
7777
* `;` (`[…; len]`): part of fixed-size array syntax. See [Primitive Types (Arrays)].
7878
* `<<` (`expr << expr`): left-shift. Overloadable (`Shl`).
79-
* `<<=` (`var <<= expr`): left-shift & assignment.
79+
* `<<=` (`var <<= expr`): left-shift & assignment. Overloadable (`ShlAssign`).
8080
* `<` (`expr < expr`): less-than comparison. Overloadable (`PartialOrd`).
8181
* `<=` (`var <= expr`): less-than or equal-to comparison. Overloadable (`PartialOrd`).
8282
* `=` (`var = expr`, `ident = type`): assignment/equivalence. See [Variable Bindings], [`type` Aliases], generic parameter defaults.
@@ -85,14 +85,14 @@
8585
* `>` (`expr > expr`): greater-than comparison. Overloadable (`PartialOrd`).
8686
* `>=` (`var >= expr`): greater-than or equal-to comparison. Overloadable (`PartialOrd`).
8787
* `>>` (`expr >> expr`): right-shift. Overloadable (`Shr`).
88-
* `>>=` (`var >>= expr`): right-shift & assignment.
88+
* `>>=` (`var >>= expr`): right-shift & assignment. Overloadable (`ShrAssign`).
8989
* `@` (`ident @ pat`): pattern binding. See [Patterns (Bindings)].
9090
* `^` (`expr ^ expr`): bitwise exclusive or. Overloadable (`BitXor`).
91-
* `^=` (`var ^= expr`): bitwise exclusive or & assignment.
91+
* `^=` (`var ^= expr`): bitwise exclusive or & assignment. Overloadable (`BitXorAssign`).
9292
* `|` (`expr | expr`): bitwise or. Overloadable (`BitOr`).
9393
* `|` (`pat | pat`): pattern alternatives. See [Patterns (Multiple patterns)].
9494
* `|` (`|…| expr`): closures. See [Closures].
95-
* `|=` (`var |= expr`): bitwise or & assignment.
95+
* `|=` (`var |= expr`): bitwise or & assignment. Overloadable (`BitOrAssign`).
9696
* `||` (`expr || expr`): logical or.
9797
* `_`: "ignored" pattern binding. See [Patterns (Ignoring bindings)].
9898

branches/beta/src/doc/reference.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,10 @@ Examples of integer literals of various forms:
379379
0usize; // type usize
380380
```
381381

382+
Note that the Rust syntax considers `-1i8` as an application of the [unary minus
383+
operator](#unary-operator-expressions) to an integer literal `1i8`, rather than
384+
a single integer literal.
385+
382386
##### Floating-point literals
383387

384388
A _floating-point literal_ has one of two forms:
@@ -1114,6 +1118,16 @@ type Point = (u8, u8);
11141118
let p: Point = (41, 68);
11151119
```
11161120

1121+
Currently a type alias to an enum type cannot be used to qualify the
1122+
constructors:
1123+
1124+
```
1125+
enum E { A }
1126+
type F = E;
1127+
let _: F = E::A; // OK
1128+
// let _: F = F::A; // Doesn't work
1129+
```
1130+
11171131
### Structs
11181132

11191133
A _struct_ is a nominal [struct type](#struct-types) defined with the
@@ -1191,18 +1205,24 @@ a = Animal::Cat { name: "Spotty".to_string(), weight: 2.7 };
11911205
In this example, `Cat` is a _struct-like enum variant_,
11921206
whereas `Dog` is simply called an enum variant.
11931207

1194-
Enums have a discriminant. You can assign them explicitly:
1208+
Each enum value has a _discriminant_ which is an integer associated to it. You
1209+
can specify it explicitly:
11951210

11961211
```
11971212
enum Foo {
11981213
Bar = 123,
11991214
}
12001215
```
12011216

1202-
If a discriminant isn't assigned, they start at zero, and add one for each
1217+
The right hand side of the specification is interpreted as an `isize` value,
1218+
but the compiler is allowed to use a smaller type in the actual memory layout.
1219+
The [`repr` attribute](#ffi-attributes) can be added in order to change
1220+
the type of the right hand side and specify the memory layout.
1221+
1222+
If a discriminant isn't specified, they start at zero, and add one for each
12031223
variant, in order.
12041224

1205-
You can cast an enum to get this value:
1225+
You can cast an enum to get its discriminant:
12061226

12071227
```
12081228
# enum Foo { Bar = 123 }
@@ -2776,7 +2796,9 @@ Rust defines the following unary operators. They are all written as prefix opera
27762796
before the expression they apply to.
27772797

27782798
* `-`
2779-
: Negation. May only be applied to numeric types.
2799+
: Negation. Signed integer types and floating-point types support negation. It
2800+
is an error to apply negation to unsigned types; for example, the compiler
2801+
rejects `-1u32`.
27802802
* `*`
27812803
: Dereference. When applied to a [pointer](#pointer-types) it denotes the
27822804
pointed-to location. For pointers to mutable locations, the resulting

branches/beta/src/etc/platform-intrinsics/generator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ def parse_args():
691691
parser.add_argument('-o', '--out', type=argparse.FileType('w'), default=sys.stdout,
692692
help = 'File to output to (default stdout).')
693693
parser.add_argument('-i', '--info', type=argparse.FileType('r'),
694-
help = 'File containing platform specific information to merge into'
694+
help = 'File containing platform specific information to merge into '
695695
'the input files\' header.')
696696
parser.add_argument('in_', metavar="FILE", type=argparse.FileType('r'), nargs='+',
697697
help = 'JSON files to load')
@@ -735,12 +735,12 @@ def open(self, platform):
735735
736736
use {{Intrinsic, i, i_, u, u_, f, v, v_, agg, p, void}};
737737
use IntrinsicDef::Named;
738-
use rustc::middle::ty;
738+
use rustc::middle::ty::TyCtxt;
739739
740740
// The default inlining settings trigger a pathological behaviour in
741741
// LLVM, which causes makes compilation very slow. See #28273.
742742
#[inline(never)]
743-
pub fn find<'tcx>(_tcx: &ty::ctxt<'tcx>, name: &str) -> Option<Intrinsic> {{
743+
pub fn find<'tcx>(_tcx: &TyCtxt<'tcx>, name: &str) -> Option<Intrinsic> {{
744744
if !name.starts_with("{0}") {{ return None }}
745745
Some(match &name["{0}".len()..] {{'''.format(platform.intrinsic_prefix())
746746

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"llvm_prefix": "llvm.x86.fma.",
3+
"intrinsics": [
4+
{
5+
"intrinsic": "{0.width_mm}_fmadd_{0.data_type}",
6+
"width": [128, 256],
7+
"llvm": "vfmadd.{0.data_type_short}{0.width_suffix}",
8+
"ret": "f(32-64)",
9+
"args": ["0", "0", "0"]
10+
},
11+
{
12+
"intrinsic": "{0.width_mm}_fmaddsub_{0.data_type}",
13+
"width": [128, 256],
14+
"llvm": "vfmaddsub.{0.data_type_short}{0.width_suffix}",
15+
"ret": "f(32-64)",
16+
"args": ["0", "0", "0"]
17+
},
18+
{
19+
"intrinsic": "{0.width_mm}_fmsub_{0.data_type}",
20+
"width": [128, 256],
21+
"llvm": "vfmsub.{0.data_type_short}{0.width_suffix}",
22+
"ret": "f(32-64)",
23+
"args": ["0", "0", "0"]
24+
},
25+
{
26+
"intrinsic": "{0.width_mm}_fmsubadd_{0.data_type}",
27+
"width": [128, 256],
28+
"llvm": "vfmsubadd.{0.data_type_short}{0.width_suffix}",
29+
"ret": "f(32-64)",
30+
"args": ["0", "0", "0"]
31+
},
32+
{
33+
"intrinsic": "{0.width_mm}_fnmadd_{0.data_type}",
34+
"width": [128, 256],
35+
"llvm": "vfnmadd.{0.data_type_short}{0.width_suffix}",
36+
"ret": "f(32-64)",
37+
"args": ["0", "0", "0"]
38+
},
39+
{
40+
"intrinsic": "{0.width_mm}_fnmsub_{0.data_type}",
41+
"width": [128, 256],
42+
"llvm": "vfnmsub.{0.data_type_short}{0.width_suffix}",
43+
"ret": "f(32-64)",
44+
"args": ["0", "0", "0"]
45+
}
46+
]
47+
}

branches/beta/src/etc/unicode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ def emit_norm_module(f, canon, compat, combine, norm_props):
398398
derived = load_properties("DerivedCoreProperties.txt", want_derived)
399399
scripts = load_properties("Scripts.txt", [])
400400
props = load_properties("PropList.txt",
401-
["White_Space", "Join_Control", "Noncharacter_Code_Point"])
401+
["White_Space", "Join_Control", "Noncharacter_Code_Point", "Pattern_White_Space"])
402402
norm_props = load_properties("DerivedNormalizationProps.txt",
403403
["Full_Composition_Exclusion"])
404404

@@ -408,7 +408,7 @@ def emit_norm_module(f, canon, compat, combine, norm_props):
408408
# category tables
409409
for (name, cat, pfuns) in ("general_category", gencats, ["N", "Cc"]), \
410410
("derived_property", derived, want_derived), \
411-
("property", props, ["White_Space"]):
411+
("property", props, ["White_Space", "Pattern_White_Space"]):
412412
emit_property_module(rf, name, cat, pfuns)
413413

414414
# normalizations and conversions module

branches/beta/src/liballoc/lib.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,13 @@
9292
#![feature(unsize)]
9393

9494
#![cfg_attr(not(test), feature(raw, fn_traits, placement_new_protocol))]
95-
#![cfg_attr(test, feature(test, rustc_private, box_heap))]
95+
#![cfg_attr(test, feature(test, box_heap))]
9696

9797
// Allow testing this library
9898

9999
#[cfg(test)]
100100
#[macro_use]
101101
extern crate std;
102-
#[cfg(test)]
103-
#[macro_use]
104-
extern crate log;
105102

106103
// Heaps provided for low-level allocation strategies
107104

branches/beta/src/liballoc_jemalloc/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ fn main() {
111111
println!("cargo:rustc-link-search=native={}/lib", build_dir.display());
112112
if target.contains("android") {
113113
println!("cargo:rustc-link-lib=gcc");
114-
} else if !target.contains("windows") {
114+
} else if !target.contains("windows") && !target.contains("musl") {
115115
println!("cargo:rustc-link-lib=pthread");
116116
}
117117
}

0 commit comments

Comments
 (0)