From b4e547d71aa379e702a737550e479116914b19cf Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 5 Sep 2012 15:58:43 -0700 Subject: [PATCH] Remove struct ctors --- src/libsyntax/ext/pipes/proto.rs | 16 +- src/libsyntax/parse/parser.rs | 96 +++---- src/libsyntax/parse/token.rs | 1 - src/rustc/driver/rustc.rs | 3 +- src/rustc/lib/llvm.rs | 28 +- src/rustc/metadata/decoder.rs | 8 +- src/rustc/middle/lang_items.rs | 63 +++-- src/rustc/middle/resolve.rs | 248 ++++++++++-------- src/rustc/middle/trans/base.rs | 7 +- src/rustc/middle/trans/common.rs | 28 +- src/rustc/middle/typeck/check/method.rs | 56 ++-- src/rustc/middle/typeck/coherence.rs | 26 +- src/rustc/util/common.rs | 7 +- src/rustdoc/demo.rs | 1 - src/test/auxiliary/cci_class.rs | 8 +- src/test/auxiliary/cci_class_2.rs | 9 +- src/test/auxiliary/cci_class_3.rs | 10 +- src/test/auxiliary/cci_class_4.rs | 11 +- src/test/auxiliary/cci_class_5.rs | 8 +- src/test/auxiliary/cci_class_6.rs | 14 +- src/test/auxiliary/cci_class_cast.rs | 14 +- src/test/auxiliary/issue-2526.rs | 15 +- src/test/auxiliary/issue-3012-1.rs | 8 +- src/test/auxiliary/issue2170lib.rs | 7 +- src/test/auxiliary/test_comm.rs | 9 +- src/test/bench/task-perf-alloc-unwind.rs | 7 +- .../bench/task-perf-word-count-generic.rs | 18 +- src/test/compile-fail/assign-to-method.rs | 8 +- .../block-must-not-have-result-res.rs | 1 - .../borrowck-borrowed-uniq-rvalue-2.rs | 7 +- .../compile-fail/borrowck-unary-move-2.rs | 9 +- .../compile-fail/cap-clause-illegal-cap.rs | 8 +- src/test/compile-fail/class-cast-to-trait.rs | 11 +- src/test/compile-fail/class-implements-int.rs | 7 +- src/test/compile-fail/class-method-missing.rs | 7 +- src/test/compile-fail/class-missing-self.rs | 2 +- src/test/compile-fail/copy-a-resource.rs | 7 +- src/test/compile-fail/issue-2063-resource.rs | 2 +- src/test/compile-fail/issue-2370-2.rs | 8 +- src/test/compile-fail/issue-2370.rs | 8 +- src/test/compile-fail/issue-2487-b.rs | 2 - src/test/compile-fail/issue-2509-a.rs | 4 - src/test/compile-fail/issue-2718-a.rs | 1 - src/test/compile-fail/issue-2825-b.rs | 9 +- src/test/compile-fail/issue-2825.rs | 13 - src/test/compile-fail/issue-3021-b.rs | 1 - .../compile-fail/lint-non-camel-case-class.rs | 4 - ...ess-ctor-access-self-with-uninit-fields.rs | 11 - .../liveness-ctor-field-never-init.rs | 7 - .../liveness-ctor-uninit-field.rs | 14 - .../compile-fail/liveness-ctor-uninit-var.rs | 22 -- src/test/compile-fail/liveness-unused.rs | 3 +- .../compile-fail/mutable-class-fields-2.rs | 8 +- src/test/compile-fail/mutable-class-fields.rs | 8 +- src/test/compile-fail/no-send-res-ports.rs | 7 +- src/test/compile-fail/non-const.rs | 14 +- src/test/compile-fail/noncopyable-class.rs | 15 +- src/test/compile-fail/pinned-deep-copy.rs | 7 +- src/test/compile-fail/private-method.rs | 8 +- src/test/compile-fail/record-with-resource.rs | 7 +- src/test/compile-fail/regions-addr-of-self.rs | 10 +- .../regions-addr-of-upvar-self.rs | 4 - src/test/compile-fail/regions-bounds.rs | 2 +- src/test/compile-fail/regions-in-rsrcs.rs | 3 - src/test/compile-fail/tps-invariant-class.rs | 6 +- src/test/compile-fail/unique-pinned-nocopy.rs | 3 +- src/test/compile-fail/unique-vec-res.rs | 5 +- src/test/compile-fail/unsendable-class.rs | 8 +- src/test/run-fail/morestack2.rs | 7 +- src/test/run-fail/morestack3.rs | 7 +- src/test/run-fail/morestack4.rs | 7 +- src/test/run-fail/rt-set-exit-status-fail2.rs | 7 +- src/test/run-fail/unwind-box-res.rs | 7 +- src/test/run-pass/binops.rs | 8 +- .../run-pass/boxed-class-type-substitution.rs | 6 +- src/test/run-pass/class-attributes-1.rs | 5 +- src/test/run-pass/class-attributes-2.rs | 15 +- .../class-cast-to-trait-multiple-types.rs | 22 +- src/test/run-pass/class-cast-to-trait.rs | 12 +- src/test/run-pass/class-dtor.rs | 11 +- src/test/run-pass/class-exports.rs | 9 +- .../class-impl-very-parameterized-trait.rs | 10 +- .../class-implement-trait-cross-crate.rs | 12 +- src/test/run-pass/class-implement-traits.rs | 12 +- src/test/run-pass/class-methods.rs | 9 +- src/test/run-pass/class-poly-methods.rs | 12 +- src/test/run-pass/class-separate-impl.rs | 11 +- src/test/run-pass/class-str-field.rs | 8 +- src/test/run-pass/class-typarams.rs | 10 +- src/test/run-pass/classes-self-referential.rs | 7 +- src/test/run-pass/classes-simple-method.rs | 9 +- src/test/run-pass/classes-simple.rs | 8 +- src/test/run-pass/classes.rs | 11 +- src/test/run-pass/conditional-compile.rs | 15 +- src/test/run-pass/explicit-self.rs | 6 +- src/test/run-pass/init-res-into-things.rs | 9 +- src/test/run-pass/issue-2288.rs | 7 +- src/test/run-pass/issue-2311-2.rs | 7 +- src/test/run-pass/issue-2445-b.rs | 8 +- src/test/run-pass/issue-2445.rs | 8 +- src/test/run-pass/issue-2487-a.rs | 8 +- src/test/run-pass/issue-2502.rs | 10 +- src/test/run-pass/issue-2550.rs | 7 +- src/test/run-pass/issue-2633.rs | 7 +- src/test/run-pass/issue-2708.rs | 14 +- src/test/run-pass/issue-2718.rs | 14 +- src/test/run-pass/issue-2735-2.rs | 9 +- src/test/run-pass/issue-2735-3.rs | 9 +- src/test/run-pass/issue-2748-a.rs | 7 +- src/test/run-pass/issue-2936.rs | 7 +- src/test/run-pass/issue-3220.rs | 7 +- src/test/run-pass/issue-979.rs | 9 +- src/test/run-pass/nested-class.rs | 7 +- src/test/run-pass/private-class-field.rs | 8 +- src/test/run-pass/private-method.rs | 8 +- .../run-pass/resource-assign-is-not-copy.rs | 9 +- src/test/run-pass/resource-cycle.rs | 13 +- src/test/run-pass/resource-cycle2.rs | 7 +- src/test/run-pass/resource-cycle3.rs | 11 +- src/test/run-pass/resource-destruct.rs | 7 +- src/test/run-pass/resource-generic.rs | 9 +- src/test/run-pass/resource-in-struct.rs | 7 +- src/test/run-pass/send-resource.rs | 7 +- src/test/run-pass/sendable-class.rs | 8 +- src/test/run-pass/task-killjoin-rsrc.rs | 8 +- src/test/run-pass/type-param-constraints.rs | 7 +- src/test/run-pass/unique-pinned-nocopy-2.rs | 7 +- src/test/run-pass/unwind-resource.rs | 10 +- src/test/run-pass/unwind-resource2.rs | 7 +- src/test/run-pass/vec-slice-drop.rs | 7 +- 130 files changed, 1017 insertions(+), 557 deletions(-) delete mode 100644 src/test/compile-fail/issue-2825.rs delete mode 100644 src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs delete mode 100644 src/test/compile-fail/liveness-ctor-field-never-init.rs delete mode 100644 src/test/compile-fail/liveness-ctor-uninit-field.rs delete mode 100644 src/test/compile-fail/liveness-ctor-uninit-var.rs diff --git a/src/libsyntax/ext/pipes/proto.rs b/src/libsyntax/ext/pipes/proto.rs index 4e09aa4c956..789ee70249f 100644 --- a/src/libsyntax/ext/pipes/proto.rs +++ b/src/libsyntax/ext/pipes/proto.rs @@ -118,6 +118,15 @@ fn protocol(name: ~str, +span: span) -> protocol { @protocol_(name, span) } +fn protocol_(name: ~str, span: span) -> protocol_ { + protocol_ { + name: name, + span: span, + states: DVec(), + bounded: None + } +} + struct protocol_ { let name: ~str; let span: span; @@ -125,13 +134,6 @@ struct protocol_ { let mut bounded: Option; - new(name: ~str, span: span) { - self.name = name; - self.span = span; - self.states = DVec(); - self.bounded = None; - } - /// Get a state. fn get_state(name: ~str) -> state { self.states.find(|i| i.name == name).get() diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b1205c77fe8..e900b7dd7b3 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -181,6 +181,37 @@ pure fn maybe_append(+lhs: ~[attribute], rhs: Option<~[attribute]>) /* ident is handled by common.rs */ +fn parser(sess: parse_sess, cfg: ast::crate_cfg, + +rdr: reader, ftype: file_type) -> parser { + + let tok0 = rdr.next_token(); + let span0 = tok0.sp; + let interner = rdr.interner(); + + parser { + reader: move rdr, + interner: move interner, + sess: sess, + cfg: cfg, + file_type: ftype, + token: tok0.tok, + span: span0, + last_span: span0, + buffer: [mut + {tok: tok0.tok, sp: span0}, + {tok: tok0.tok, sp: span0}, + {tok: tok0.tok, sp: span0}, + {tok: tok0.tok, sp: span0} + ]/4, + buffer_start: 0, + buffer_end: 0, + restriction: UNRESTRICTED, + quote_depth: 0u, + keywords: token::keyword_table(), + restricted_keywords: token::restricted_keyword_table() + } +} + struct parser { let sess: parse_sess; let cfg: crate_cfg; @@ -198,32 +229,6 @@ struct parser { let keywords: hashmap<~str, ()>; let restricted_keywords: hashmap<~str, ()>; - new(sess: parse_sess, cfg: ast::crate_cfg, +rdr: reader, ftype: file_type) - { - self.reader <- rdr; - self.interner = self.reader.interner(); - let tok0 = self.reader.next_token(); - let span0 = tok0.sp; - self.sess = sess; - self.cfg = cfg; - self.file_type = ftype; - self.token = tok0.tok; - self.span = span0; - self.last_span = span0; - self.buffer = [mut - {tok: tok0.tok, sp: span0}, - {tok: tok0.tok, sp: span0}, - {tok: tok0.tok, sp: span0}, - {tok: tok0.tok, sp: span0} - ]/4; - self.buffer_start = 0; - self.buffer_end = 0; - self.restriction = UNRESTRICTED; - self.quote_depth = 0u; - self.keywords = token::keyword_table(); - self.restricted_keywords = token::restricted_keyword_table(); - } - drop {} /* do not copy the parser; its state is tied to outside state */ fn bump() { @@ -2594,7 +2599,6 @@ struct parser { let class_name = self.parse_value_ident(); self.parse_region_param(); let ty_params = self.parse_ty_params(); - let class_path = self.ident_to_path_tys(class_name, ty_params); let traits : ~[@trait_ref] = if self.eat(token::COLON) { self.parse_trait_ref_list(token::LBRACE) } else { ~[] }; @@ -2610,7 +2614,7 @@ struct parser { // It's a record-like struct. fields = ~[]; while self.token != token::RBRACE { - match self.parse_class_item(class_path) { + match self.parse_class_item() { ctor_decl(a_fn_decl, attrs, blk, s) => { match the_ctor { Some((_, _, _, s_first)) => { @@ -2747,24 +2751,13 @@ struct parser { } } - fn parse_ctor(attrs: ~[attribute], - result_ty: ast::ty_) -> class_contents { - let lo = self.last_span.lo; - let (decl_, _) = self.parse_fn_decl(|p| p.parse_arg()); - let decl = {output: @{id: self.get_id(), - node: result_ty, span: decl_.output.span}, - .. decl_}; - let body = self.parse_block(); - ctor_decl(decl, attrs, body, mk_sp(lo, self.last_span.hi)) - } - fn parse_dtor(attrs: ~[attribute]) -> class_contents { let lo = self.last_span.lo; let body = self.parse_block(); dtor_decl(body, attrs, mk_sp(lo, self.last_span.hi)) } - fn parse_class_item(class_name_with_tps: @path) -> class_contents { + fn parse_class_item() -> class_contents { if self.eat_keyword(~"priv") { // XXX: Remove after snapshot. match self.token { @@ -2789,12 +2782,7 @@ struct parser { let attrs = self.parse_outer_attributes(); - if self.eat_keyword(~"new") { - // result type is always the type of the class - return self.parse_ctor(attrs, ty_path(class_name_with_tps, - self.get_id())); - } - else if self.eat_keyword(~"drop") { + if self.eat_keyword(~"drop") { return self.parse_dtor(attrs); } else { @@ -3019,12 +3007,12 @@ struct parser { } } - fn parse_struct_def(path: @path) -> @struct_def { + fn parse_struct_def() -> @struct_def { let mut the_dtor: Option<(blk, ~[attribute], codemap::span)> = None; let mut fields: ~[@struct_field] = ~[]; let mut methods: ~[@method] = ~[]; while self.token != token::RBRACE { - match self.parse_class_item(path) { + match self.parse_class_item() { ctor_decl(*) => { self.span_fatal(copy self.span, ~"deprecated explicit \ @@ -3076,7 +3064,7 @@ struct parser { }; } - fn parse_enum_def(ident: ast::ident, ty_params: ~[ast::ty_param]) + fn parse_enum_def(ty_params: ~[ast::ty_param]) -> enum_def { let mut variants: ~[variant] = ~[]; let mut all_nullary = true, have_disr = false; @@ -3092,8 +3080,7 @@ struct parser { self.fatal(~"duplicate declaration of shared fields"); } self.expect(token::LBRACE); - let path = self.ident_to_path_tys(ident, ty_params); - common_fields = Some(self.parse_struct_def(path)); + common_fields = Some(self.parse_struct_def()); again; } @@ -3105,7 +3092,7 @@ struct parser { if self.eat_keyword(~"enum") { ident = self.parse_ident(); self.expect(token::LBRACE); - let nested_enum_def = self.parse_enum_def(ident, ty_params); + let nested_enum_def = self.parse_enum_def(ty_params); kind = enum_variant_kind(move nested_enum_def); needs_comma = false; } else { @@ -3113,8 +3100,7 @@ struct parser { if self.eat(token::LBRACE) { // Parse a struct variant. all_nullary = false; - let path = self.ident_to_path_tys(ident, ty_params); - kind = struct_variant_kind(self.parse_struct_def(path)); + kind = struct_variant_kind(self.parse_struct_def()); } else if self.token == token::LPAREN { all_nullary = false; let arg_tys = self.parse_unspanned_seq( @@ -3176,7 +3162,7 @@ struct parser { } self.expect(token::LBRACE); - let enum_definition = self.parse_enum_def(id, ty_params); + let enum_definition = self.parse_enum_def(ty_params); (id, item_enum(enum_definition, ty_params), None) } diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index a9bcb762597..945f4c6b279 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -422,7 +422,6 @@ fn restricted_keyword_table() -> hashmap<~str, ()> { ~"if", ~"impl", ~"import", ~"let", ~"log", ~"loop", ~"match", ~"mod", ~"module", ~"move", ~"mut", - ~"new", ~"owned", ~"pure", ~"ref", ~"return", diff --git a/src/rustc/driver/rustc.rs b/src/rustc/driver/rustc.rs index c6b8bc2d7b9..8b8325853cc 100644 --- a/src/rustc/driver/rustc.rs +++ b/src/rustc/driver/rustc.rs @@ -241,11 +241,10 @@ fn monitor(+f: fn~(diagnostic::emitter)) { struct finally { let ch: comm::Chan; - new(ch: comm::Chan) { self.ch = ch; } drop { comm::send(self.ch, done); } } - let _finally = finally(ch); + let _finally = finally { ch: ch }; f(demitter) } { diff --git a/src/rustc/lib/llvm.rs b/src/rustc/lib/llvm.rs index fe737442bd0..23566e59cf9 100644 --- a/src/rustc/lib/llvm.rs +++ b/src/rustc/lib/llvm.rs @@ -1175,10 +1175,15 @@ fn fn_ty_param_tys(fn_ty: TypeRef) -> ~[TypeRef] unsafe { struct target_data_res { let TD: TargetDataRef; - new(TD: TargetDataRef) { self.TD = TD; } drop { llvm::LLVMDisposeTargetData(self.TD); } } +fn target_data_res(TD: TargetDataRef) -> target_data_res { + target_data_res { + TD: TD + } +} + type target_data = {lltd: TargetDataRef, dtor: @target_data_res}; fn mk_target_data(string_rep: ~str) -> target_data { @@ -1191,10 +1196,15 @@ fn mk_target_data(string_rep: ~str) -> target_data { struct pass_manager_res { let PM: PassManagerRef; - new(PM: PassManagerRef) { self.PM = PM; } drop { llvm::LLVMDisposePassManager(self.PM); } } +fn pass_manager_res(PM: PassManagerRef) -> pass_manager_res { + pass_manager_res { + PM: PM + } +} + type pass_manager = {llpm: PassManagerRef, dtor: @pass_manager_res}; fn mk_pass_manager() -> pass_manager { @@ -1206,10 +1216,15 @@ fn mk_pass_manager() -> pass_manager { struct object_file_res { let ObjectFile: ObjectFileRef; - new(ObjectFile: ObjectFileRef) { self.ObjectFile = ObjectFile; } drop { llvm::LLVMDisposeObjectFile(self.ObjectFile); } } +fn object_file_res(ObjectFile: ObjectFileRef) -> object_file_res{ + object_file_res { + ObjectFile: ObjectFile + } +} + type object_file = {llof: ObjectFileRef, dtor: @object_file_res}; fn mk_object_file(llmb: MemoryBufferRef) -> Option { @@ -1222,10 +1237,15 @@ fn mk_object_file(llmb: MemoryBufferRef) -> Option { struct section_iter_res { let SI: SectionIteratorRef; - new(SI: SectionIteratorRef) { self.SI = SI; } drop { llvm::LLVMDisposeSectionIterator(self.SI); } } +fn section_iter_res(SI: SectionIteratorRef) -> section_iter_res { + section_iter_res { + SI: SI + } +} + type section_iter = {llsi: SectionIteratorRef, dtor: @section_iter_res}; fn mk_section_iter(llof: ObjectFileRef) -> section_iter { diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs index d9ecc114062..4e2c7b8ee72 100644 --- a/src/rustc/metadata/decoder.rs +++ b/src/rustc/metadata/decoder.rs @@ -442,10 +442,12 @@ struct path_entry { let path_string: ~str; // The definition, implementation, or field that this path corresponds to. let def_like: def_like; +} - new(path_string: ~str, def_like: def_like) { - self.path_string = path_string; - self.def_like = def_like; +fn path_entry(path_string: ~str, def_like: def_like) -> path_entry { + path_entry { + path_string: path_string, + def_like: def_like } } diff --git a/src/rustc/middle/lang_items.rs b/src/rustc/middle/lang_items.rs index b57f1eac19b..3d8771166b6 100644 --- a/src/rustc/middle/lang_items.rs +++ b/src/rustc/middle/lang_items.rs @@ -72,6 +72,41 @@ mod LanguageItems { } } +fn LanguageItemCollector(crate: @crate, session: session, + items: &r/LanguageItems) + -> LanguageItemCollector/&r { + + let item_refs = str_hash(); + + item_refs.insert(~"const", &mut items.const_trait); + item_refs.insert(~"copy", &mut items.copy_trait); + item_refs.insert(~"send", &mut items.send_trait); + item_refs.insert(~"owned", &mut items.owned_trait); + + item_refs.insert(~"add", &mut items.add_trait); + item_refs.insert(~"sub", &mut items.sub_trait); + item_refs.insert(~"mul", &mut items.mul_trait); + item_refs.insert(~"div", &mut items.div_trait); + item_refs.insert(~"modulo", &mut items.modulo_trait); + item_refs.insert(~"neg", &mut items.neg_trait); + item_refs.insert(~"bitxor", &mut items.bitxor_trait); + item_refs.insert(~"bitand", &mut items.bitand_trait); + item_refs.insert(~"bitor", &mut items.bitor_trait); + item_refs.insert(~"shl", &mut items.shl_trait); + item_refs.insert(~"shr", &mut items.shr_trait); + item_refs.insert(~"index", &mut items.index_trait); + + item_refs.insert(~"eq", &mut items.eq_trait); + item_refs.insert(~"ord", &mut items.ord_trait); + + LanguageItemCollector { + crate: crate, + session: session, + items: items, + item_refs: item_refs + } +} + struct LanguageItemCollector { let items: &LanguageItems; @@ -80,34 +115,6 @@ struct LanguageItemCollector { let item_refs: hashmap<~str,&mut Option>; - new(crate: @crate, session: session, items: &self/LanguageItems) { - self.crate = crate; - self.session = session; - self.items = items; - self.item_refs = str_hash(); - - self.item_refs.insert(~"const", &mut self.items.const_trait); - self.item_refs.insert(~"copy", &mut self.items.copy_trait); - self.item_refs.insert(~"send", &mut self.items.send_trait); - self.item_refs.insert(~"owned", &mut self.items.owned_trait); - - self.item_refs.insert(~"add", &mut self.items.add_trait); - self.item_refs.insert(~"sub", &mut self.items.sub_trait); - self.item_refs.insert(~"mul", &mut self.items.mul_trait); - self.item_refs.insert(~"div", &mut self.items.div_trait); - self.item_refs.insert(~"modulo", &mut self.items.modulo_trait); - self.item_refs.insert(~"neg", &mut self.items.neg_trait); - self.item_refs.insert(~"bitxor", &mut self.items.bitxor_trait); - self.item_refs.insert(~"bitand", &mut self.items.bitand_trait); - self.item_refs.insert(~"bitor", &mut self.items.bitor_trait); - self.item_refs.insert(~"shl", &mut self.items.shl_trait); - self.item_refs.insert(~"shr", &mut self.items.shr_trait); - self.item_refs.insert(~"index", &mut self.items.index_trait); - - self.item_refs.insert(~"eq", &mut self.items.eq_trait); - self.item_refs.insert(~"ord", &mut self.items.ord_trait); - } - fn match_and_collect_meta_item(item_def_id: def_id, meta_item: meta_item) { diff --git a/src/rustc/middle/resolve.rs b/src/rustc/middle/resolve.rs index 05872159f8c..1168260b519 100644 --- a/src/rustc/middle/resolve.rs +++ b/src/rustc/middle/resolve.rs @@ -311,26 +311,30 @@ fn atom_hashmap() -> hashmap { struct Rib { let bindings: hashmap; let kind: RibKind; +} - new(kind: RibKind) { - self.bindings = atom_hashmap(); - self.kind = kind; +fn Rib(kind: RibKind) -> Rib { + Rib { + bindings: atom_hashmap(), + kind: kind } } + /// One import directive. struct ImportDirective { let module_path: @DVec; let subclass: @ImportDirectiveSubclass; let span: span; +} - new(module_path: @DVec, - subclass: @ImportDirectiveSubclass, - span: span) { - - self.module_path = module_path; - self.subclass = subclass; - self.span = span; +fn ImportDirective(module_path: @DVec, + subclass: @ImportDirectiveSubclass, + span: span) -> ImportDirective { + ImportDirective { + module_path: module_path, + subclass: subclass, + span: span } } @@ -338,10 +342,12 @@ struct ImportDirective { struct Target { let target_module: @Module; let bindings: @NameBindings; +} - new(target_module: @Module, bindings: @NameBindings) { - self.target_module = target_module; - self.bindings = bindings; +fn Target(target_module: @Module, bindings: @NameBindings) -> Target { + Target { + target_module: target_module, + bindings: bindings } } @@ -360,18 +366,6 @@ struct ImportResolution { let mut used: bool; - new(span: span) { - self.span = span; - - self.outstanding_references = 0u; - - self.module_target = None; - self.value_target = None; - self.type_target = None; - - self.used = false; - } - fn target_for_namespace(namespace: Namespace) -> Option { match namespace { ModuleNS => return copy self.module_target, @@ -381,6 +375,17 @@ struct ImportResolution { } } +fn ImportResolution(span: span) -> ImportResolution { + ImportResolution { + span: span, + outstanding_references: 0u, + module_target: None, + value_target: None, + type_target: None, + used: false + } +} + /// The link from a module up to its nearest parent node. enum ParentLink { NoParentLink, @@ -430,27 +435,25 @@ struct Module { // The index of the import we're resolving. let mut resolved_import_count: uint; - new(parent_link: ParentLink, def_id: Option) { - self.parent_link = parent_link; - self.def_id = def_id; - - self.children = atom_hashmap(); - self.imports = DVec(); - - self.anonymous_children = int_hash(); - - self.exported_names = atom_hashmap(); - - self.import_resolutions = atom_hashmap(); - self.glob_count = 0u; - self.resolved_import_count = 0u; - } - fn all_imports_resolved() -> bool { return self.imports.len() == self.resolved_import_count; } } +fn Module(parent_link: ParentLink, def_id: Option) -> Module { + Module { + parent_link: parent_link, + def_id: def_id, + children: atom_hashmap(), + imports: DVec(), + anonymous_children: int_hash(), + exported_names: atom_hashmap(), + import_resolutions: atom_hashmap(), + glob_count: 0u, + resolved_import_count: 0u + } +} + // XXX: This is a workaround due to is_none in the standard library mistakenly // requiring a T:copy. @@ -501,15 +504,6 @@ struct NameBindings { let mut type_span: Option; let mut value_span: Option; - new() { - self.module_def = NoModuleDef; - self.type_def = None; - self.value_def = None; - self.module_span = None; - self.type_span = None; - self.value_span = None; - } - /// Creates a new module in this set of name bindings. fn define_module(parent_link: ParentLink, def_id: Option, sp: span) { @@ -598,31 +592,22 @@ struct NameBindings { } } +fn NameBindings() -> NameBindings { + NameBindings { + module_def: NoModuleDef, + type_def: None, + value_def: None, + module_span: None, + type_span: None, + value_span: None + } +} + + /// Interns the names of the primitive types. struct PrimitiveTypeTable { let primitive_types: hashmap; - new(intr: ident_interner) { - self.primitive_types = atom_hashmap(); - - self.intern(intr, @~"bool", ty_bool); - self.intern(intr, @~"char", ty_int(ty_char)); - self.intern(intr, @~"float", ty_float(ty_f)); - self.intern(intr, @~"f32", ty_float(ty_f32)); - self.intern(intr, @~"f64", ty_float(ty_f64)); - self.intern(intr, @~"int", ty_int(ty_i)); - self.intern(intr, @~"i8", ty_int(ty_i8)); - self.intern(intr, @~"i16", ty_int(ty_i16)); - self.intern(intr, @~"i32", ty_int(ty_i32)); - self.intern(intr, @~"i64", ty_int(ty_i64)); - self.intern(intr, @~"str", ty_str); - self.intern(intr, @~"uint", ty_uint(ty_u)); - self.intern(intr, @~"u8", ty_uint(ty_u8)); - self.intern(intr, @~"u16", ty_uint(ty_u16)); - self.intern(intr, @~"u32", ty_uint(ty_u32)); - self.intern(intr, @~"u64", ty_uint(ty_u64)); - } - fn intern(intr: ident_interner, string: @~str, primitive_type: prim_ty) { let atom = intr.intern(string); @@ -630,6 +615,32 @@ struct PrimitiveTypeTable { } } +fn PrimitiveTypeTable(intr: ident_interner) -> PrimitiveTypeTable { + let table = PrimitiveTypeTable { + primitive_types: atom_hashmap() + }; + + table.intern(intr, @~"bool", ty_bool); + table.intern(intr, @~"char", ty_int(ty_char)); + table.intern(intr, @~"float", ty_float(ty_f)); + table.intern(intr, @~"f32", ty_float(ty_f32)); + table.intern(intr, @~"f64", ty_float(ty_f64)); + table.intern(intr, @~"int", ty_int(ty_i)); + table.intern(intr, @~"i8", ty_int(ty_i8)); + table.intern(intr, @~"i16", ty_int(ty_i16)); + table.intern(intr, @~"i32", ty_int(ty_i32)); + table.intern(intr, @~"i64", ty_int(ty_i64)); + table.intern(intr, @~"str", ty_str); + table.intern(intr, @~"uint", ty_uint(ty_u)); + table.intern(intr, @~"u8", ty_uint(ty_u8)); + table.intern(intr, @~"u16", ty_uint(ty_u16)); + table.intern(intr, @~"u32", ty_uint(ty_u32)); + table.intern(intr, @~"u64", ty_uint(ty_u64)); + + return table; +} + + fn namespace_to_str(ns: Namespace) -> ~str { match ns { TypeNS => ~"type", @@ -638,6 +649,59 @@ fn namespace_to_str(ns: Namespace) -> ~str { } } +fn Resolver(session: session, lang_items: LanguageItems, + crate: @crate) -> Resolver { + + let graph_root = @NameBindings(); + + (*graph_root).define_module(NoParentLink, + Some({ crate: 0, node: 0 }), + crate.span); + + let current_module = (*graph_root).get_module(); + + let self = Resolver { + session: session, + lang_items: copy lang_items, + crate: crate, + + // The outermost module has def ID 0; this is not reflected in the + // AST. + + graph_root: graph_root, + + unused_import_lint_level: unused_import_lint_level(session), + + trait_info: new_def_hash(), + structs: new_def_hash(), + + unresolved_imports: 0u, + + current_module: current_module, + value_ribs: @DVec(), + type_ribs: @DVec(), + label_ribs: @DVec(), + + xray_context: NoXray, + current_trait_refs: None, + + self_atom: syntax::parse::token::special_idents::self_, + primitive_type_table: @PrimitiveTypeTable(session. + parse_sess.interner), + + namespaces: ~[ ModuleNS, TypeNS, ValueNS ], + + def_map: int_hash(), + export_map: int_hash(), + export_map2: int_hash(), + trait_map: @int_hash(), + + intr: session.intr() + }; + + return self; +} + /// The main resolver class. struct Resolver { let session: session; @@ -690,48 +754,6 @@ struct Resolver { let export_map2: ExportMap2; let trait_map: TraitMap; - new(session: session, lang_items: LanguageItems, crate: @crate) { - self.session = session; - self.lang_items = copy lang_items; - self.crate = crate; - - // The outermost module has def ID 0; this is not reflected in the - // AST. - - self.graph_root = @NameBindings(); - (*self.graph_root).define_module(NoParentLink, - Some({ crate: 0, node: 0 }), - crate.span); - - self.unused_import_lint_level = unused_import_lint_level(session); - - self.trait_info = new_def_hash(); - self.structs = new_def_hash(); - - self.unresolved_imports = 0u; - - self.current_module = (*self.graph_root).get_module(); - self.value_ribs = @DVec(); - self.type_ribs = @DVec(); - self.label_ribs = @DVec(); - - self.xray_context = NoXray; - self.current_trait_refs = None; - - self.self_atom = syntax::parse::token::special_idents::self_; - self.primitive_type_table = @PrimitiveTypeTable(self.session. - parse_sess.interner); - - self.namespaces = ~[ ModuleNS, TypeNS, ValueNS ]; - - self.def_map = int_hash(); - self.export_map = int_hash(); - self.export_map2 = int_hash(); - self.trait_map = @int_hash(); - - self.intr = session.intr(); - } - /// The main name resolution procedure. fn resolve(@self, this: @Resolver) { self.build_reduced_graph(this); diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index b74d89dc465..3eef274e9d6 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -56,7 +56,6 @@ use option::{is_none, is_some}; struct icx_popper { let ccx: @crate_ctxt; - new(ccx: @crate_ctxt) { self.ccx = ccx; } drop { if self.ccx.sess.count_llvm_insns() { vec::pop(*(self.ccx.stats.llvm_insn_ctxt)); @@ -64,6 +63,12 @@ struct icx_popper { } } +fn icx_popper(ccx: @crate_ctxt) -> icx_popper { + icx_popper { + ccx: ccx + } +} + trait get_insn_ctxt { fn insn_ctxt(s: &str) -> icx_popper; } diff --git a/src/rustc/middle/trans/common.rs b/src/rustc/middle/trans/common.rs index 6fb547d757d..6b3e4063d67 100644 --- a/src/rustc/middle/trans/common.rs +++ b/src/rustc/middle/trans/common.rs @@ -95,10 +95,15 @@ type stats = struct BuilderRef_res { let B: BuilderRef; - new(B: BuilderRef) { self.B = B; } drop { llvm::LLVMDisposeBuilder(self.B); } } +fn BuilderRef_res(B: BuilderRef) -> BuilderRef_res { + BuilderRef_res { + B: B + } +} + // Crate context. Every crate we compile has one of these. type crate_ctxt = { sess: session::session, @@ -485,12 +490,21 @@ struct block_ { // The function context for the function to which this block is // attached. let fcx: fn_ctxt; - new(llbb: BasicBlockRef, parent: Option, -kind: block_kind, - is_lpad: bool, node_info: Option, fcx: fn_ctxt) { - // sigh - self.llbb = llbb; self.terminated = false; self.unreachable = false; - self.parent = parent; self.kind = kind; self.is_lpad = is_lpad; - self.node_info = node_info; self.fcx = fcx; +} + +fn block_(llbb: BasicBlockRef, parent: Option, -kind: block_kind, + is_lpad: bool, node_info: Option, fcx: fn_ctxt) + -> block_ { + + block_ { + llbb: llbb, + terminated: false, + unreachable: false, + parent: parent, + kind: kind, + is_lpad: is_lpad, + node_info: node_info, + fcx: fcx } } diff --git a/src/rustc/middle/typeck/check/method.rs b/src/rustc/middle/typeck/check/method.rs index cb4bd4296e3..b356a1b7f67 100644 --- a/src/rustc/middle/typeck/check/method.rs +++ b/src/rustc/middle/typeck/check/method.rs @@ -63,6 +63,35 @@ fn get_mode_from_self_type(self_type: ast::self_ty_) -> ast::rmode { } } +fn lookup(fcx: @fn_ctxt, + + // In a call `a.b::(...)`: + expr: @ast::expr, // The expression `a.b`. + self_expr: @ast::expr, // The expression `a`. + borrow_lb: ast::node_id, // Scope to borrow the expression `a` for. + node_id: ast::node_id, // The node_id in which to store the type of + // `a.b`. + m_name: ast::ident, // The ident `b`. + self_ty: ty::t, // The type of `a`. + supplied_tps: ~[ty::t], // The list of types X, Y, ... . + include_private: bool) -> lookup { + + lookup { + fcx: fcx, + expr: expr, + self_expr: self_expr, + borrow_lb: borrow_lb, + node_id: node_id, + m_name: m_name, + self_ty: self_ty, + derefs: 0u, + candidates: DVec(), + candidate_impls: new_def_hash(), + supplied_tps: supplied_tps, + include_private: include_private + } +} + struct lookup { let fcx: @fn_ctxt; let expr: @ast::expr; @@ -77,33 +106,6 @@ struct lookup { let supplied_tps: ~[ty::t]; let include_private: bool; - new(fcx: @fn_ctxt, - - // In a call `a.b::(...)`: - expr: @ast::expr, // The expression `a.b`. - self_expr: @ast::expr, // The expression `a`. - borrow_lb: ast::node_id, // Scope to borrow the expression `a` for. - node_id: ast::node_id, // The node_id in which to store the type of - // `a.b`. - m_name: ast::ident, // The ident `b`. - self_ty: ty::t, // The type of `a`. - supplied_tps: ~[ty::t], // The list of types X, Y, ... . - include_private: bool) { - - self.fcx = fcx; - self.expr = expr; - self.self_expr = self_expr; - self.borrow_lb = borrow_lb; - self.node_id = node_id; - self.m_name = m_name; - self.self_ty = self_ty; - self.derefs = 0u; - self.candidates = DVec(); - self.candidate_impls = new_def_hash(); - self.supplied_tps = supplied_tps; - self.include_private = include_private; - } - // Entrypoint: fn method() -> Option { debug!("method lookup(m_name=%s, self_ty=%s, %?)", diff --git a/src/rustc/middle/typeck/coherence.rs b/src/rustc/middle/typeck/coherence.rs index 1377e41cdca..a01b0983e70 100644 --- a/src/rustc/middle/typeck/coherence.rs +++ b/src/rustc/middle/typeck/coherence.rs @@ -126,10 +126,22 @@ struct CoherenceInfo { // Contains implementations of methods associated with a trait. For these, // the associated trait must be imported at the call site. let extension_methods: hashmap>; +} - new() { - self.inherent_methods = new_def_hash(); - self.extension_methods = new_def_hash(); +fn CoherenceInfo() -> CoherenceInfo { + CoherenceInfo { + inherent_methods: new_def_hash(), + extension_methods: new_def_hash() + } +} + +fn CoherenceChecker(crate_context: @crate_ctxt) -> CoherenceChecker { + CoherenceChecker { + crate_context: crate_context, + inference_context: new_infer_ctxt(crate_context.tcx), + + base_type_def_ids: new_def_hash(), + privileged_implementations: int_hash() } } @@ -147,14 +159,6 @@ struct CoherenceChecker { let privileged_implementations: hashmap; - new(crate_context: @crate_ctxt) { - self.crate_context = crate_context; - self.inference_context = new_infer_ctxt(crate_context.tcx); - - self.base_type_def_ids = new_def_hash(); - self.privileged_implementations = int_hash(); - } - // Create a mapping containing a MethodInfo for every provided // method in every trait. fn build_provided_methods_map(crate: @crate) { diff --git a/src/rustc/util/common.rs b/src/rustc/util/common.rs index a4754fd4769..ee941c0ed01 100644 --- a/src/rustc/util/common.rs +++ b/src/rustc/util/common.rs @@ -16,10 +16,15 @@ fn indent(op: fn() -> R) -> R { struct _indenter { let _i: (); - new(_i: ()) { self._i = (); } drop { debug!("<<"); } } +fn _indenter(_i: ()) -> _indenter { + _indenter { + _i: () + } +} + fn indenter() -> _indenter { debug!(">>"); _indenter(()) diff --git a/src/rustdoc/demo.rs b/src/rustdoc/demo.rs index 8968d481f6a..1ed5adfa4a6 100644 --- a/src/rustdoc/demo.rs +++ b/src/rustdoc/demo.rs @@ -113,7 +113,6 @@ mod blade_runner { */ struct bored { let bored: bool; - new(bored: bool) { self.bored = bored; } drop { log(error, self.bored); } } diff --git a/src/test/auxiliary/cci_class.rs b/src/test/auxiliary/cci_class.rs index 46312dc989b..3a0d119a091 100644 --- a/src/test/auxiliary/cci_class.rs +++ b/src/test/auxiliary/cci_class.rs @@ -7,7 +7,13 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } } + fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } + } + } diff --git a/src/test/auxiliary/cci_class_2.rs b/src/test/auxiliary/cci_class_2.rs index bd3e17000b1..a6dee67eeb4 100644 --- a/src/test/auxiliary/cci_class_2.rs +++ b/src/test/auxiliary/cci_class_2.rs @@ -7,9 +7,14 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } - fn speak() {} } + fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } + } + } diff --git a/src/test/auxiliary/cci_class_3.rs b/src/test/auxiliary/cci_class_3.rs index 6b62cd166db..ec32b666805 100644 --- a/src/test/auxiliary/cci_class_3.rs +++ b/src/test/auxiliary/cci_class_3.rs @@ -7,11 +7,17 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } - fn speak() { self.meows += 1u; } fn meow_count() -> uint { self.meows } } + fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } + } + + } diff --git a/src/test/auxiliary/cci_class_4.rs b/src/test/auxiliary/cci_class_4.rs index 95ca81bf97f..78e9a3a599c 100644 --- a/src/test/auxiliary/cci_class_4.rs +++ b/src/test/auxiliary/cci_class_4.rs @@ -15,9 +15,6 @@ struct cat { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -33,4 +30,12 @@ struct cat { } } + fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } + } + } diff --git a/src/test/auxiliary/cci_class_5.rs b/src/test/auxiliary/cci_class_5.rs index 5e5c5c53d9c..b8b68fc9a51 100644 --- a/src/test/auxiliary/cci_class_5.rs +++ b/src/test/auxiliary/cci_class_5.rs @@ -8,7 +8,13 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } } + fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } + } + } \ No newline at end of file diff --git a/src/test/auxiliary/cci_class_6.rs b/src/test/auxiliary/cci_class_6.rs index 18ffb35d3e5..9d8d5543cd3 100644 --- a/src/test/auxiliary/cci_class_6.rs +++ b/src/test/auxiliary/cci_class_6.rs @@ -8,14 +8,20 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int, -in_info: ~[U]) - { self.meows = in_x; self.how_hungry = in_y; - self.info <- in_info; } - fn speak(stuff: ~[T]) { self.meows += stuff.len(); } fn meow_count() -> uint { self.meows } } + +fn cat(in_x : uint, in_y : int, -in_info: ~[U]) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + info: in_info + } +} + + } diff --git a/src/test/auxiliary/cci_class_cast.rs b/src/test/auxiliary/cci_class_cast.rs index 830ca90628a..c12a8d2e926 100644 --- a/src/test/auxiliary/cci_class_cast.rs +++ b/src/test/auxiliary/cci_class_cast.rs @@ -18,9 +18,6 @@ struct cat : ToStr { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -37,4 +34,15 @@ struct cat : ToStr { fn to_str() -> ~str { self.name } } + +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } } + +} + + diff --git a/src/test/auxiliary/issue-2526.rs b/src/test/auxiliary/issue-2526.rs index 1d1adbf179d..ee7d57aa397 100644 --- a/src/test/auxiliary/issue-2526.rs +++ b/src/test/auxiliary/issue-2526.rs @@ -9,10 +9,15 @@ export context; struct arc_destruct { let _data: int; - new(data: int) { self._data = data; } drop {} } +fn arc_destruct(data: int) -> arc_destruct { + arc_destruct { + _data: data + } +} + fn arc(_data: T) -> arc_destruct { arc_destruct(0) } @@ -24,11 +29,15 @@ fn init() -> arc_destruct unsafe { struct context_res { let ctx : int; - new() { self.ctx = 0; } - drop { } } +fn context_res() -> context_res { + context_res { + ctx: 0 + } +} + type context = arc_destruct; impl context { diff --git a/src/test/auxiliary/issue-3012-1.rs b/src/test/auxiliary/issue-3012-1.rs index d47f16c7f11..2193550c650 100644 --- a/src/test/auxiliary/issue-3012-1.rs +++ b/src/test/auxiliary/issue-3012-1.rs @@ -7,7 +7,13 @@ export socket_handle; struct socket_handle { let sockfd: libc::c_int; - new(x: libc::c_int) {self.sockfd = x;} drop { /* c::close(self.sockfd); */ } } + + fn socket_handle(x: libc::c_int) -> socket_handle { + socket_handle { + sockfd: x + } + } + } diff --git a/src/test/auxiliary/issue2170lib.rs b/src/test/auxiliary/issue2170lib.rs index cca092faf00..7393ffd42f9 100644 --- a/src/test/auxiliary/issue2170lib.rs +++ b/src/test/auxiliary/issue2170lib.rs @@ -5,6 +5,11 @@ fn foo(_x: i32) { struct rsrc { let x: i32; - new(x: i32) { self.x = x; } drop { foo(self.x); } +} + +fn rsrc(x: i32) -> rsrc { + rsrc { + x: x + } } \ No newline at end of file diff --git a/src/test/auxiliary/test_comm.rs b/src/test/auxiliary/test_comm.rs index 0fb66520479..a9b87d466f0 100644 --- a/src/test/auxiliary/test_comm.rs +++ b/src/test/auxiliary/test_comm.rs @@ -29,9 +29,6 @@ fn port() -> port { struct port_ptr { let po: *rust_port; - new(po: *rust_port) { - debug!("in the port_ptr constructor"); - self.po = po; } drop unsafe { debug!("in the port_ptr destructor"); do task::unkillable { @@ -51,6 +48,12 @@ struct port_ptr { } } +fn port_ptr(po: *rust_port) -> port_ptr { + debug!("in the port_ptr constructor"); + port_ptr { + po: po + } +} /** * Receive from a port. If no data is available on the port then the diff --git a/src/test/bench/task-perf-alloc-unwind.rs b/src/test/bench/task-perf-alloc-unwind.rs index 51267986e6c..2191ba691ce 100644 --- a/src/test/bench/task-perf-alloc-unwind.rs +++ b/src/test/bench/task-perf-alloc-unwind.rs @@ -42,10 +42,15 @@ enum st { struct r { let _l: @nillist; - new(l: @nillist) { self._l = l; } drop {} } +fn r(l: @nillist) -> r { + r { + _l: l + } +} + fn recurse_or_fail(depth: int, st: Option) { if depth == 0 { debug!("unwinding %.4f", precise_time_s()); diff --git a/src/test/bench/task-perf-word-count-generic.rs b/src/test/bench/task-perf-word-count-generic.rs index c414c85781d..5fe738aa7b1 100644 --- a/src/test/bench/task-perf-word-count-generic.rs +++ b/src/test/bench/task-perf-word-count-generic.rs @@ -98,7 +98,6 @@ fn reduce(&&word: ~str, get: map_reduce::getter) { struct box { let mut contents: Option; - new(+x: T) { self.contents = Some(x); } fn swap(f: fn(+T) -> T) { let mut tmp = None; @@ -113,6 +112,12 @@ struct box { } } +fn box(+x: T) -> box { + box { + contents: Some(x) + } +} + mod map_reduce { export putter; export getter; @@ -345,10 +350,6 @@ fn is_word_char(c: char) -> bool { struct random_word_reader: word_reader { let mut remaining: uint; let rng: rand::Rng; - new(count: uint) { - self.remaining = count; - self.rng = rand::Rng(); - } fn read_word() -> Option<~str> { if self.remaining > 0 { @@ -359,3 +360,10 @@ struct random_word_reader: word_reader { else { None } } } + +fn random_word_reader(count: uint) -> random_word_reader { + random_word_reader { + remaining: count, + rng: rand::Rng() + } +} diff --git a/src/test/compile-fail/assign-to-method.rs b/src/test/compile-fail/assign-to-method.rs index 0208b745d49..2fe4e49e0a8 100644 --- a/src/test/compile-fail/assign-to-method.rs +++ b/src/test/compile-fail/assign-to-method.rs @@ -6,7 +6,13 @@ struct cat { let how_hungry : int; fn speak() { self.meows += 1u; } - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/compile-fail/block-must-not-have-result-res.rs b/src/test/compile-fail/block-must-not-have-result-res.rs index 958cabb61b8..3ab4a6a72f2 100644 --- a/src/test/compile-fail/block-must-not-have-result-res.rs +++ b/src/test/compile-fail/block-must-not-have-result-res.rs @@ -1,7 +1,6 @@ // error-pattern:mismatched types: expected `()` but found `bool` struct r { - new() {} drop { true } } diff --git a/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs b/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs index 6dfe23c1995..e643cd4ceaa 100644 --- a/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs +++ b/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs @@ -1,9 +1,14 @@ struct defer { x: &[&str]; - new(x: &[&str]) { self.x = x; } drop { #error["%?", self.x]; } } +fn defer(x: &r/[&r/str]) -> defer/&r { + defer { + x: x + } +} + fn main() { let _x = defer(~["Goodbye", "world!"]); //~ ERROR illegal borrow } diff --git a/src/test/compile-fail/borrowck-unary-move-2.rs b/src/test/compile-fail/borrowck-unary-move-2.rs index 82c09f5036b..b0a49db488a 100644 --- a/src/test/compile-fail/borrowck-unary-move-2.rs +++ b/src/test/compile-fail/borrowck-unary-move-2.rs @@ -1,6 +1,13 @@ struct noncopyable { - i: (); new() { self.i = (); } drop { #error["dropped"]; } + i: (); drop { #error["dropped"]; } } + +fn noncopyable() -> noncopyable { + noncopyable { + i: () + } +} + enum wrapper = noncopyable; fn main() { diff --git a/src/test/compile-fail/cap-clause-illegal-cap.rs b/src/test/compile-fail/cap-clause-illegal-cap.rs index 3703c44f520..22f63d2e2ce 100644 --- a/src/test/compile-fail/cap-clause-illegal-cap.rs +++ b/src/test/compile-fail/cap-clause-illegal-cap.rs @@ -1,6 +1,12 @@ // error-pattern: copying a noncopyable value -struct foo { let x: int; new(x: int) { self.x = x; } drop { } } +struct foo { let x: int; drop { } } + +fn foo(x: int) -> foo { + foo { + x: x + } +} fn to_lambda2(b: foo) -> fn@(uint) -> uint { // test case where copy clause specifies a value that is not used diff --git a/src/test/compile-fail/class-cast-to-trait.rs b/src/test/compile-fail/class-cast-to-trait.rs index 7a6c85474b5..5d7eac5fd9c 100644 --- a/src/test/compile-fail/class-cast-to-trait.rs +++ b/src/test/compile-fail/class-cast-to-trait.rs @@ -18,9 +18,6 @@ struct cat : noisy { let mut how_hungry : int; let name : str; - new(in_x : uint, in_y : int, in_name: str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -36,6 +33,14 @@ struct cat : noisy { } } +fn cat(in_x : uint, in_y : int, in_name: str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} + fn main() { let nyan : noisy = cat(0u, 2, "nyan") as noisy; nyan.eat(); diff --git a/src/test/compile-fail/class-implements-int.rs b/src/test/compile-fail/class-implements-int.rs index 9f86953c3cf..d85a6e57827 100644 --- a/src/test/compile-fail/class-implements-int.rs +++ b/src/test/compile-fail/class-implements-int.rs @@ -1,6 +1,11 @@ struct cat : int { //~ ERROR trait let meows: uint; - new(in_x : uint) { self.meows = in_x; } +} + +fn cat(in_x : uint) -> cat { + cat { + meows: in_x + } } fn main() { diff --git a/src/test/compile-fail/class-method-missing.rs b/src/test/compile-fail/class-method-missing.rs index 31cc23d8162..38680d4274d 100644 --- a/src/test/compile-fail/class-method-missing.rs +++ b/src/test/compile-fail/class-method-missing.rs @@ -5,7 +5,12 @@ trait animal { struct cat : animal { let meows: uint; - new(in_x : uint) { self.meows = in_x; } +} + +fn cat(in_x : uint) -> cat { + cat { + meows: in_x + } } fn main() { diff --git a/src/test/compile-fail/class-missing-self.rs b/src/test/compile-fail/class-missing-self.rs index 57c8ec272e1..95795bdd182 100644 --- a/src/test/compile-fail/class-missing-self.rs +++ b/src/test/compile-fail/class-missing-self.rs @@ -9,7 +9,7 @@ struct cat { } } - new(in_x : uint) { self.meows = in_x; } } + fn main() { } \ No newline at end of file diff --git a/src/test/compile-fail/copy-a-resource.rs b/src/test/compile-fail/copy-a-resource.rs index 2e8673156bf..6192f340121 100644 --- a/src/test/compile-fail/copy-a-resource.rs +++ b/src/test/compile-fail/copy-a-resource.rs @@ -2,8 +2,13 @@ struct foo { let i: int; - new(i:int) { self.i = i; } drop {} } +fn foo(i:int) -> foo { + foo { + i: i + } +} + fn main() { let x <- foo(10); let y = x; log(error, x); } diff --git a/src/test/compile-fail/issue-2063-resource.rs b/src/test/compile-fail/issue-2063-resource.rs index 98eb509c8d7..191420e5998 100644 --- a/src/test/compile-fail/issue-2063-resource.rs +++ b/src/test/compile-fail/issue-2063-resource.rs @@ -4,8 +4,8 @@ struct t { //~ ERROR this type cannot be instantiated let x: x; let to_str: (); - new(x: x) { self.x = x; self.to_str = (); } } + enum x = @t; //~ ERROR this type cannot be instantiated fn main() { diff --git a/src/test/compile-fail/issue-2370-2.rs b/src/test/compile-fail/issue-2370-2.rs index e8abfd3f450..273483415fc 100644 --- a/src/test/compile-fail/issue-2370-2.rs +++ b/src/test/compile-fail/issue-2370-2.rs @@ -1,7 +1,9 @@ // error-pattern: type cat cannot be dereferenced -struct cat { new() {} } +struct cat { + x: () +} fn main() { - let kitty : cat = cat(); - log (error, *kitty); + let kitty : cat = cat { x: () }; + log (error, *kitty); } \ No newline at end of file diff --git a/src/test/compile-fail/issue-2370.rs b/src/test/compile-fail/issue-2370.rs index 9074eb7e1b8..dd8de95fdaa 100644 --- a/src/test/compile-fail/issue-2370.rs +++ b/src/test/compile-fail/issue-2370.rs @@ -1,7 +1,9 @@ // error-pattern: type cat cannot be dereferenced -struct cat { new() {} } +struct cat { + foo: () +} fn main() { - let nyan = cat(); - log (error, *nyan); + let nyan = cat { foo: () }; + log (error, *nyan); } \ No newline at end of file diff --git a/src/test/compile-fail/issue-2487-b.rs b/src/test/compile-fail/issue-2487-b.rs index ada5b6ffa05..3469e9ea53a 100644 --- a/src/test/compile-fail/issue-2487-b.rs +++ b/src/test/compile-fail/issue-2487-b.rs @@ -1,8 +1,6 @@ struct socket { let sock: int; - new() { self.sock = 1; } - drop { } fn set_identity() { diff --git a/src/test/compile-fail/issue-2509-a.rs b/src/test/compile-fail/issue-2509-a.rs index fc1f4dc7159..a24e3bdee36 100644 --- a/src/test/compile-fail/issue-2509-a.rs +++ b/src/test/compile-fail/issue-2509-a.rs @@ -1,9 +1,5 @@ struct c { //~ ERROR a struct must have at least one field - new() { } } fn main() { - let a = c(); - let x = ~[a]; - let _y = x[0]; } diff --git a/src/test/compile-fail/issue-2718-a.rs b/src/test/compile-fail/issue-2718-a.rs index d7ea3f67d41..e8323acb56b 100644 --- a/src/test/compile-fail/issue-2718-a.rs +++ b/src/test/compile-fail/issue-2718-a.rs @@ -1,6 +1,5 @@ struct send_packet { let p: T; - new(p: T) { self.p = p; } } diff --git a/src/test/compile-fail/issue-2825-b.rs b/src/test/compile-fail/issue-2825-b.rs index 7be3d077050..a879dae3859 100644 --- a/src/test/compile-fail/issue-2825-b.rs +++ b/src/test/compile-fail/issue-2825-b.rs @@ -1,14 +1,17 @@ struct example { let x: int; - new() { - self.x = 1; - } drop {} //~ ERROR First destructor declared drop { debug!("Goodbye, cruel world"); } } +fn example() -> example { + example { + x: 1 + } +} + fn main(_args: ~[~str]) { let e: example = example(); } diff --git a/src/test/compile-fail/issue-2825.rs b/src/test/compile-fail/issue-2825.rs deleted file mode 100644 index 82a76273bd4..00000000000 --- a/src/test/compile-fail/issue-2825.rs +++ /dev/null @@ -1,13 +0,0 @@ -struct example { - let x: int; - new() { //~ ERROR First constructor declared here - self.x = 1; - } - new(x_: int) { - self.x = x_; - } -} - -fn main(_args: ~[~str]) { - let e: example = example(); -} diff --git a/src/test/compile-fail/issue-3021-b.rs b/src/test/compile-fail/issue-3021-b.rs index 005cae43081..d267aa52bfd 100644 --- a/src/test/compile-fail/issue-3021-b.rs +++ b/src/test/compile-fail/issue-3021-b.rs @@ -8,7 +8,6 @@ fn siphash(k0 : u64) { self.v0 = k0 ^ 0x736f6d6570736575; //~ ERROR attempted dynamic environment-capture //~^ ERROR unresolved name: k0 } - new() { self.v0 = 0; } } } diff --git a/src/test/compile-fail/lint-non-camel-case-class.rs b/src/test/compile-fail/lint-non-camel-case-class.rs index 94043961484..8254b867130 100644 --- a/src/test/compile-fail/lint-non-camel-case-class.rs +++ b/src/test/compile-fail/lint-non-camel-case-class.rs @@ -1,10 +1,6 @@ #[forbid(non_camel_case_types)] struct foo { //~ ERROR type, variant, or trait must be camel case let bar: int; - - new() { - self.bar = 0; - } } fn main() { diff --git a/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs b/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs deleted file mode 100644 index a3277db4fce..00000000000 --- a/src/test/compile-fail/liveness-ctor-access-self-with-uninit-fields.rs +++ /dev/null @@ -1,11 +0,0 @@ -struct cat { - let how_hungry : int; - fn meow() {} - new() { - self.meow(); - //~^ ERROR use of possibly uninitialized field: `self.how_hungry` - } -} - -fn main() { -} diff --git a/src/test/compile-fail/liveness-ctor-field-never-init.rs b/src/test/compile-fail/liveness-ctor-field-never-init.rs deleted file mode 100644 index 405c1a4b57b..00000000000 --- a/src/test/compile-fail/liveness-ctor-field-never-init.rs +++ /dev/null @@ -1,7 +0,0 @@ -struct cat { - let how_hungry : int; - new() {} //~ ERROR field `self.how_hungry` is never initialized -} - -fn main() { -} diff --git a/src/test/compile-fail/liveness-ctor-uninit-field.rs b/src/test/compile-fail/liveness-ctor-uninit-field.rs deleted file mode 100644 index 9a846efae4e..00000000000 --- a/src/test/compile-fail/liveness-ctor-uninit-field.rs +++ /dev/null @@ -1,14 +0,0 @@ -struct cat { - let mut a: int; - let mut b: int; - let mut c: int; - - new() { - self.a = 3; - self.b = self.a; - self.a += self.c; //~ ERROR use of possibly uninitialized field: `self.c` - } -} - -fn main() { -} diff --git a/src/test/compile-fail/liveness-ctor-uninit-var.rs b/src/test/compile-fail/liveness-ctor-uninit-var.rs deleted file mode 100644 index 041812a575f..00000000000 --- a/src/test/compile-fail/liveness-ctor-uninit-var.rs +++ /dev/null @@ -1,22 +0,0 @@ -struct cat { - priv { - let mut meows : uint; - } - - let how_hungry : int; - - fn eat() { - self.how_hungry -= 5; - } - - new(in_x : uint, in_y : int) { - let foo; - self.meows = in_x + (in_y as uint); - self.how_hungry = foo; //~ ERROR use of possibly uninitialized variable: `foo` - } -} - -fn main() { - let nyan : cat = cat(52u, 99); - nyan.eat(); -} diff --git a/src/test/compile-fail/liveness-unused.rs b/src/test/compile-fail/liveness-unused.rs index e991a210422..656a7c492eb 100644 --- a/src/test/compile-fail/liveness-unused.rs +++ b/src/test/compile-fail/liveness-unused.rs @@ -50,10 +50,9 @@ fn f4b() -> int { // leave this in here just to trigger compile-fail: struct r { let x: (); - new() { self.x = (); } drop {} } fn main() { - let x = r(); + let x = r { x: () }; fn@() { copy x; }; //~ ERROR copying a noncopyable value } diff --git a/src/test/compile-fail/mutable-class-fields-2.rs b/src/test/compile-fail/mutable-class-fields-2.rs index 808b7ff3177..5ebbf63a3cf 100644 --- a/src/test/compile-fail/mutable-class-fields-2.rs +++ b/src/test/compile-fail/mutable-class-fields-2.rs @@ -10,7 +10,13 @@ struct cat { self.how_hungry -= 5; } - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/compile-fail/mutable-class-fields.rs b/src/test/compile-fail/mutable-class-fields.rs index 011656ac3ad..da79c9cb0a6 100644 --- a/src/test/compile-fail/mutable-class-fields.rs +++ b/src/test/compile-fail/mutable-class-fields.rs @@ -6,7 +6,13 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/compile-fail/no-send-res-ports.rs b/src/test/compile-fail/no-send-res-ports.rs index 2a6c26e9f13..6ee79873435 100644 --- a/src/test/compile-fail/no-send-res-ports.rs +++ b/src/test/compile-fail/no-send-res-ports.rs @@ -1,9 +1,14 @@ fn main() { struct foo { let _x: comm::Port<()>; - new(x: comm::Port<()>) { self._x = x; } drop {} } + + fn foo(x: comm::Port<()>) -> foo { + foo { + _x: x + } + } let x = ~mut Some(foo(comm::Port())); diff --git a/src/test/compile-fail/non-const.rs b/src/test/compile-fail/non-const.rs index cd160294f74..7e3545fb89b 100644 --- a/src/test/compile-fail/non-const.rs +++ b/src/test/compile-fail/non-const.rs @@ -4,16 +4,26 @@ fn foo(_x: T) { } struct r { let x:int; - new(x:int) { self.x = x; } drop {} } +fn r(x:int) -> r { + r { + x: x + } +} + struct r2 { let x:@mut int; - new(x:@mut int) { self.x = x; } drop {} } +fn r2(x:@mut int) -> r2 { + r2 { + x: x + } +} + fn main() { foo({f: 3}); foo({mut f: 3}); //~ ERROR missing `const` diff --git a/src/test/compile-fail/noncopyable-class.rs b/src/test/compile-fail/noncopyable-class.rs index e1fd1294b14..2e8c3a6a213 100644 --- a/src/test/compile-fail/noncopyable-class.rs +++ b/src/test/compile-fail/noncopyable-class.rs @@ -4,14 +4,25 @@ // copied struct bar { let x: int; - new(x:int) {self.x = x;} drop {} } +fn bar(x:int) -> bar { + bar { + x: x + } +} + struct foo { let i: int; let j: bar; - new(i:int) { self.i = i; self.j = bar(5); } +} + +fn foo(i:int) -> foo { + foo { + i: i, + j: bar(5) + } } fn main() { let x <- foo(10); let y = x; log(error, x); } diff --git a/src/test/compile-fail/pinned-deep-copy.rs b/src/test/compile-fail/pinned-deep-copy.rs index ce9dfbc3f62..d2b0cabf4a9 100644 --- a/src/test/compile-fail/pinned-deep-copy.rs +++ b/src/test/compile-fail/pinned-deep-copy.rs @@ -2,10 +2,15 @@ struct r { let i: @mut int; - new(i: @mut int) { self.i = i; } drop { *(self.i) = *(self.i) + 1; } } +fn r(i: @mut int) -> r { + r { + i: i + } +} + fn main() { let i = @mut 0; { diff --git a/src/test/compile-fail/private-method.rs b/src/test/compile-fail/private-method.rs index a1d71ba6af9..52236642c87 100644 --- a/src/test/compile-fail/private-method.rs +++ b/src/test/compile-fail/private-method.rs @@ -7,7 +7,13 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/compile-fail/record-with-resource.rs b/src/test/compile-fail/record-with-resource.rs index e194f73c753..577367e673b 100644 --- a/src/test/compile-fail/record-with-resource.rs +++ b/src/test/compile-fail/record-with-resource.rs @@ -2,10 +2,15 @@ struct my_resource { let x: int; - new(x: int) { self.x = x; } drop { log(error, self.x); } } +fn my_resource(x: int) -> my_resource { + my_resource { + x: x + } +} + fn main() { { let a = {x: 0, y: my_resource(20)}; diff --git a/src/test/compile-fail/regions-addr-of-self.rs b/src/test/compile-fail/regions-addr-of-self.rs index 9bfc39c32dc..d6ca910bc93 100644 --- a/src/test/compile-fail/regions-addr-of-self.rs +++ b/src/test/compile-fail/regions-addr-of-self.rs @@ -1,10 +1,6 @@ struct dog { let mut cats_chased: uint; - new() { - self.cats_chased = 0u; - } - fn chase_cat() { let p: &static/mut uint = &mut self.cats_chased; //~ ERROR illegal borrow *p += 1u; @@ -16,6 +12,12 @@ struct dog { } } +fn dog() -> dog { + dog { + cats_chased: 0u + } +} + fn main() { let d = dog(); d.chase_cat(); diff --git a/src/test/compile-fail/regions-addr-of-upvar-self.rs b/src/test/compile-fail/regions-addr-of-upvar-self.rs index 31d2fef14eb..145cc0f722d 100644 --- a/src/test/compile-fail/regions-addr-of-upvar-self.rs +++ b/src/test/compile-fail/regions-addr-of-upvar-self.rs @@ -1,10 +1,6 @@ struct dog { let mut food: uint; - new() { - self.food = 0u; - } - fn chase_cat() { for uint::range(0u, 10u) |_i| { let p: &static/mut uint = &mut self.food; //~ ERROR illegal borrow diff --git a/src/test/compile-fail/regions-bounds.rs b/src/test/compile-fail/regions-bounds.rs index a4faeed6958..4e272e80663 100644 --- a/src/test/compile-fail/regions-bounds.rs +++ b/src/test/compile-fail/regions-bounds.rs @@ -4,7 +4,7 @@ enum an_enum = ∫ trait a_trait { fn foo() -> &self/int; } -struct a_class { let x:&self/int; new(x:&self/int) { self.x = x; } } +struct a_class { let x:&self/int; } fn a_fn1(e: an_enum/&a) -> an_enum/&b { return e; //~ ERROR mismatched types: expected `an_enum/&b` but found `an_enum/&a` diff --git a/src/test/compile-fail/regions-in-rsrcs.rs b/src/test/compile-fail/regions-in-rsrcs.rs index e02683b7372..ed2be33cb23 100644 --- a/src/test/compile-fail/regions-in-rsrcs.rs +++ b/src/test/compile-fail/regions-in-rsrcs.rs @@ -1,18 +1,15 @@ struct yes0 { let x: &uint; - new(x: &uint) { self.x = x; } drop {} } struct yes1 { let x: &self/uint; - new(x: &self/uint) { self.x = x; } drop {} } struct yes2 { let x: &foo/uint; //~ ERROR named regions other than `self` are not allowed as part of a type declaration - new(x: &foo/uint) { self.x = x; } //~ ERROR named regions other than `self` are not allowed as part of a type declaration drop {} } diff --git a/src/test/compile-fail/tps-invariant-class.rs b/src/test/compile-fail/tps-invariant-class.rs index 641e0351a47..d3e5c4aea3b 100644 --- a/src/test/compile-fail/tps-invariant-class.rs +++ b/src/test/compile-fail/tps-invariant-class.rs @@ -1,8 +1,10 @@ struct box_impl { let mut f: T; +} - new(f: T) { - self.f = f; +fn box_impl(f: T) -> box_impl { + box_impl { + f: f } } diff --git a/src/test/compile-fail/unique-pinned-nocopy.rs b/src/test/compile-fail/unique-pinned-nocopy.rs index d729aad5f02..e3dd18092d7 100644 --- a/src/test/compile-fail/unique-pinned-nocopy.rs +++ b/src/test/compile-fail/unique-pinned-nocopy.rs @@ -2,12 +2,11 @@ struct r { let b:bool; - new(b: bool) { self.b = b; } drop {} } fn main() { - let i <- ~r(true); + let i <- ~r { b: true }; let j = i; log(debug, i); } \ No newline at end of file diff --git a/src/test/compile-fail/unique-vec-res.rs b/src/test/compile-fail/unique-vec-res.rs index e357bf28373..d0386996515 100644 --- a/src/test/compile-fail/unique-vec-res.rs +++ b/src/test/compile-fail/unique-vec-res.rs @@ -2,7 +2,6 @@ struct r { let i: @mut int; - new(i: @mut int) { self.i = i; } drop { *(self.i) = *(self.i) + 1; } } @@ -13,8 +12,8 @@ fn f(+i: ~[T], +j: ~[T]) { fn main() { let i1 = @mut 0; let i2 = @mut 1; - let r1 <- ~[~r(i1)]; - let r2 <- ~[~r(i2)]; + let r1 <- ~[~r { i: i1 }]; + let r2 <- ~[~r { i: i2 }]; f(r1, r2); log(debug, (r2, *i1)); log(debug, (r1, *i2)); diff --git a/src/test/compile-fail/unsendable-class.rs b/src/test/compile-fail/unsendable-class.rs index 29d89fbf860..66bc0ae544e 100644 --- a/src/test/compile-fail/unsendable-class.rs +++ b/src/test/compile-fail/unsendable-class.rs @@ -4,7 +4,13 @@ struct foo { let i: int; let j: @~str; - new(i:int, j: @~str) { self.i = i; self.j = j; } +} + +fn foo(i:int, j: @~str) -> foo { + foo { + i: i, + j: j + } } fn main() { diff --git a/src/test/run-fail/morestack2.rs b/src/test/run-fail/morestack2.rs index 3edc22252b2..c501ea6d7b8 100644 --- a/src/test/run-fail/morestack2.rs +++ b/src/test/run-fail/morestack2.rs @@ -22,7 +22,6 @@ fn getbig_call_c_and_fail(i: int) { struct and_then_get_big_again { let x:int; - new(x:int) {self.x = x;} drop { fn getbig(i: int) { if i != 0 { @@ -33,6 +32,12 @@ struct and_then_get_big_again { } } +fn and_then_get_big_again(x:int) -> and_then_get_big_again { + and_then_get_big_again { + x: x + } +} + fn main() { do task::spawn { let r = and_then_get_big_again(4); diff --git a/src/test/run-fail/morestack3.rs b/src/test/run-fail/morestack3.rs index fd537df50eb..1db2a8b1a98 100644 --- a/src/test/run-fail/morestack3.rs +++ b/src/test/run-fail/morestack3.rs @@ -15,7 +15,6 @@ fn getbig_and_fail(&&i: int) { struct and_then_get_big_again { let x:int; - new(x:int) {self.x = x;} drop { fn getbig(i: int) { if i != 0 { @@ -26,6 +25,12 @@ struct and_then_get_big_again { } } +fn and_then_get_big_again(x:int) -> and_then_get_big_again { + and_then_get_big_again { + x: x + } +} + fn main() { do task::spawn { getbig_and_fail(400); diff --git a/src/test/run-fail/morestack4.rs b/src/test/run-fail/morestack4.rs index 9977e4616d8..2424db84521 100644 --- a/src/test/run-fail/morestack4.rs +++ b/src/test/run-fail/morestack4.rs @@ -15,10 +15,15 @@ fn getbig_and_fail(&&i: int) { struct and_then_get_big_again { let x:int; - new(x:int) {self.x = x;} drop {} } +fn and_then_get_big_again(x:int) -> and_then_get_big_again { + and_then_get_big_again { + x: x + } +} + fn main() { do task::spawn { getbig_and_fail(1); diff --git a/src/test/run-fail/rt-set-exit-status-fail2.rs b/src/test/run-fail/rt-set-exit-status-fail2.rs index 6a722ecdedf..342be7edb1a 100644 --- a/src/test/run-fail/rt-set-exit-status-fail2.rs +++ b/src/test/run-fail/rt-set-exit-status-fail2.rs @@ -8,7 +8,12 @@ struct r { drop { os::set_exit_status(50); } - new(x:int) {self.x = x;} +} + +fn r(x:int) -> r { + r { + x: x + } } fn main() { diff --git a/src/test/run-fail/unwind-box-res.rs b/src/test/run-fail/unwind-box-res.rs index 2295a8ff2d7..dcf660b8f44 100644 --- a/src/test/run-fail/unwind-box-res.rs +++ b/src/test/run-fail/unwind-box-res.rs @@ -6,12 +6,17 @@ fn failfn() { struct r { let v: *int; - new(v: *int) { self.v = v; } drop unsafe { let _v2: ~int = unsafe::reinterpret_cast(&self.v); } } +fn r(v: *int) -> r { + r { + v: v + } +} + fn main() unsafe { let i1 = ~0; let i1p = unsafe::reinterpret_cast(&i1); diff --git a/src/test/run-pass/binops.rs b/src/test/run-pass/binops.rs index 3d647175ef6..1cad6feef88 100644 --- a/src/test/run-pass/binops.rs +++ b/src/test/run-pass/binops.rs @@ -80,7 +80,13 @@ extern mod test { struct p { let mut x: int; let mut y: int; - new(x: int, y: int) { self.x = x; self.y = y; } +} + +fn p(x: int, y: int) -> p { + p { + x: x, + y: y + } } impl p : cmp::Eq { diff --git a/src/test/run-pass/boxed-class-type-substitution.rs b/src/test/run-pass/boxed-class-type-substitution.rs index 5713b5b1a31..6d49bd26b4c 100644 --- a/src/test/run-pass/boxed-class-type-substitution.rs +++ b/src/test/run-pass/boxed-class-type-substitution.rs @@ -9,9 +9,11 @@ fn empty() -> Tree { fail } struct Box { let tree: Tree<@Box>; +} - new() { - self.tree = empty(); +fn Box() -> Box { + Box { + tree: empty() } } diff --git a/src/test/run-pass/class-attributes-1.rs b/src/test/run-pass/class-attributes-1.rs index e56c728d027..0c89ecaf916 100644 --- a/src/test/run-pass/class-attributes-1.rs +++ b/src/test/run-pass/class-attributes-1.rs @@ -1,11 +1,12 @@ // pp-exact - Make sure we actually print the attributes struct cat { - #[cat_maker] - new(name: ~str) { self.name = name; } #[cat_dropper] drop { error!("%s landed on hir feet",self.name); } name: ~str, } +#[cat_maker] +fn cat(name: ~str) -> cat { cat{name: name,} } + fn main() { let _kitty = cat(~"Spotty"); } diff --git a/src/test/run-pass/class-attributes-2.rs b/src/test/run-pass/class-attributes-2.rs index 772aea9867b..c5758ad1ecc 100644 --- a/src/test/run-pass/class-attributes-2.rs +++ b/src/test/run-pass/class-attributes-2.rs @@ -1,10 +1,5 @@ struct cat { let name: ~str; - #[cat_maker] - /** - Maybe it should technically be a kitten_maker. - */ - new(name: ~str) { self.name = name; } #[cat_dropper] /** Actually, cats don't always land on their feet when you drop them. @@ -12,6 +7,16 @@ struct cat { drop { error!("%s landed on hir feet", self.name); } } +#[cat_maker] +/** +Maybe it should technically be a kitten_maker. +*/ +fn cat(name: ~str) -> cat { + cat { + name: name + } +} + fn main() { let _kitty = cat(~"Spotty"); } diff --git a/src/test/run-pass/class-cast-to-trait-multiple-types.rs b/src/test/run-pass/class-cast-to-trait-multiple-types.rs index 28d96f64be9..391452f5827 100644 --- a/src/test/run-pass/class-cast-to-trait-multiple-types.rs +++ b/src/test/run-pass/class-cast-to-trait-multiple-types.rs @@ -21,11 +21,16 @@ struct dog : noisy { let volume : @mut int; - new() { self.volume = @mut 0; self.barks = @mut 0u; } - fn speak() -> int { self.bark() } } +fn dog() -> dog { + dog { + volume: @mut 0, + barks: @mut 0u + } +} + struct cat : noisy { priv { let meows : @mut uint; @@ -42,14 +47,19 @@ struct cat : noisy { let how_hungry : @mut int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = @mut in_x; self.how_hungry = @mut in_y; - self.name = in_name; } - fn speak() -> int { self.meow() as int } fn meow_count() -> uint { *self.meows } } +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: @mut in_x, + how_hungry: @mut in_y, + name: in_name + } +} + + fn annoy_neighbors(critter: T) { for uint::range(0u, 10u) |i| { critter.speak(); } } diff --git a/src/test/run-pass/class-cast-to-trait.rs b/src/test/run-pass/class-cast-to-trait.rs index 3126824c184..c88f3eb3782 100644 --- a/src/test/run-pass/class-cast-to-trait.rs +++ b/src/test/run-pass/class-cast-to-trait.rs @@ -17,9 +17,6 @@ struct cat : noisy { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -35,6 +32,15 @@ struct cat : noisy { } } +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} + + fn main() { let nyan : noisy = cat(0u, 2, ~"nyan") as noisy; nyan.speak(); diff --git a/src/test/run-pass/class-dtor.rs b/src/test/run-pass/class-dtor.rs index 9c22f23acea..5637e31825a 100644 --- a/src/test/run-pass/class-dtor.rs +++ b/src/test/run-pass/class-dtor.rs @@ -1,11 +1,14 @@ struct cat { let done : extern fn(uint); let meows : uint; - new(done: extern fn(uint)) { - self.meows = 0u; - self.done = done; - } drop { self.done(self.meows); } } +fn cat(done: extern fn(uint)) -> cat { + cat { + meows: 0u, + done: done + } +} + fn main() {} diff --git a/src/test/run-pass/class-exports.rs b/src/test/run-pass/class-exports.rs index e5c5b4ecf21..cf7a97e3873 100644 --- a/src/test/run-pass/class-exports.rs +++ b/src/test/run-pass/class-exports.rs @@ -10,8 +10,15 @@ mod kitty { let name: ~str; fn get_name() -> ~str { self.name } - new(in_name: ~str) { self.name = in_name; self.meows = 0u; } } + + fn cat(in_name: ~str) -> cat { + cat { + name: in_name, + meows: 0u + } + } + } fn main() { diff --git a/src/test/run-pass/class-impl-very-parameterized-trait.rs b/src/test/run-pass/class-impl-very-parameterized-trait.rs index 9241f92250d..dee9e9c79de 100644 --- a/src/test/run-pass/class-impl-very-parameterized-trait.rs +++ b/src/test/run-pass/class-impl-very-parameterized-trait.rs @@ -29,9 +29,6 @@ struct cat : map { let mut how_hungry : int; let name : T; - new(in_x : int, in_y : int, in_name: T) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -96,6 +93,13 @@ struct cat : map { fn clear() { } } +fn cat(in_x : int, in_y : int, in_name: T) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} fn main() { let nyan : cat<~str> = cat(0, 2, ~"nyan"); diff --git a/src/test/run-pass/class-implement-trait-cross-crate.rs b/src/test/run-pass/class-implement-trait-cross-crate.rs index 1ba1646dcf0..d7e288f7aa4 100644 --- a/src/test/run-pass/class-implement-trait-cross-crate.rs +++ b/src/test/run-pass/class-implement-trait-cross-crate.rs @@ -18,9 +18,6 @@ struct cat : noisy { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -36,6 +33,15 @@ struct cat : noisy { } } +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} + + fn main() { let nyan = cat(0u, 2, ~"nyan"); nyan.eat(); diff --git a/src/test/run-pass/class-implement-traits.rs b/src/test/run-pass/class-implement-traits.rs index 4eead77e805..7641f00d919 100644 --- a/src/test/run-pass/class-implement-traits.rs +++ b/src/test/run-pass/class-implement-traits.rs @@ -17,9 +17,6 @@ struct cat : noisy { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -35,6 +32,15 @@ struct cat : noisy { } } +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} + + fn make_speak(c: C) { c.speak(); } diff --git a/src/test/run-pass/class-methods.rs b/src/test/run-pass/class-methods.rs index 825f9caf395..dbdb9e6a688 100644 --- a/src/test/run-pass/class-methods.rs +++ b/src/test/run-pass/class-methods.rs @@ -5,12 +5,17 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } - fn speak() { self.meows += 1u; } fn meow_count() -> uint { self.meows } } +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } +} + fn main() { let nyan : cat = cat(52u, 99); let kitty = cat(1000u, 2); diff --git a/src/test/run-pass/class-poly-methods.rs b/src/test/run-pass/class-poly-methods.rs index 8eb9c19a963..f73cd61937b 100644 --- a/src/test/run-pass/class-poly-methods.rs +++ b/src/test/run-pass/class-poly-methods.rs @@ -6,16 +6,20 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int, -in_info: ~[U]) - { self.meows = in_x; self.how_hungry = in_y; - self.info <- in_info; } - fn speak(stuff: ~[T]) { self.meows += stuff.len(); } fn meow_count() -> uint { self.meows } } +fn cat(in_x : uint, in_y : int, -in_info: ~[U]) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + info: move in_info + } +} + fn main() { let nyan : cat = cat::(52u, 99, ~[9]); let kitty = cat(1000u, 2, ~[~"tabby"]); diff --git a/src/test/run-pass/class-separate-impl.rs b/src/test/run-pass/class-separate-impl.rs index 957855736ea..6b8200a5f79 100644 --- a/src/test/run-pass/class-separate-impl.rs +++ b/src/test/run-pass/class-separate-impl.rs @@ -17,9 +17,6 @@ struct cat { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -35,6 +32,14 @@ struct cat { } } +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} + impl cat: ToStr { fn to_str() -> ~str { self.name } } diff --git a/src/test/run-pass/class-str-field.rs b/src/test/run-pass/class-str-field.rs index 97ffdea1e59..a0a93bf9c46 100644 --- a/src/test/run-pass/class-str-field.rs +++ b/src/test/run-pass/class-str-field.rs @@ -2,8 +2,12 @@ struct cat { let name : ~str; - new(in_name: ~str) - { self.name = in_name; } +} + +fn cat(in_name: ~str) -> cat { + cat { + name: in_name + } } fn main() { diff --git a/src/test/run-pass/class-typarams.rs b/src/test/run-pass/class-typarams.rs index 834988eaf97..504a3985e88 100644 --- a/src/test/run-pass/class-typarams.rs +++ b/src/test/run-pass/class-typarams.rs @@ -5,14 +5,20 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } - fn speak() { self.meows += 1u; } fn meow_count() -> uint { self.meows } } +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } +} + + fn main() { let _nyan : cat = cat::(52u, 99); // let kitty = cat(1000u, 2); diff --git a/src/test/run-pass/classes-self-referential.rs b/src/test/run-pass/classes-self-referential.rs index 7a8a371cb71..4d47c21281e 100644 --- a/src/test/run-pass/classes-self-referential.rs +++ b/src/test/run-pass/classes-self-referential.rs @@ -1,7 +1,10 @@ struct kitten { let cat: Option; - new(cat: Option) { - self.cat = cat; +} + +fn kitten(cat: Option) -> kitten { + kitten { + cat: cat } } diff --git a/src/test/run-pass/classes-simple-method.rs b/src/test/run-pass/classes-simple-method.rs index 388ea5f8776..e2a39d41d57 100644 --- a/src/test/run-pass/classes-simple-method.rs +++ b/src/test/run-pass/classes-simple-method.rs @@ -5,11 +5,16 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } - fn speak() {} } +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } +} + fn main() { let nyan : cat = cat(52u, 99); let kitty = cat(1000u, 2); diff --git a/src/test/run-pass/classes-simple.rs b/src/test/run-pass/classes-simple.rs index ef93e0e3bc6..61ca9ba0933 100644 --- a/src/test/run-pass/classes-simple.rs +++ b/src/test/run-pass/classes-simple.rs @@ -5,7 +5,13 @@ struct cat { let how_hungry : int; - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/run-pass/classes.rs b/src/test/run-pass/classes.rs index 3f0d9ad311c..fdbe4a66c99 100644 --- a/src/test/run-pass/classes.rs +++ b/src/test/run-pass/classes.rs @@ -13,9 +13,6 @@ struct cat { let mut how_hungry : int; let name : ~str; - new(in_x : uint, in_y : int, in_name: ~str) - { self.meows = in_x; self.how_hungry = in_y; self.name = in_name; } - fn speak() { self.meow(); } fn eat() -> bool { @@ -31,6 +28,14 @@ struct cat { } } +fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat { + cat { + meows: in_x, + how_hungry: in_y, + name: in_name + } +} + fn main() { let nyan = cat(0u, 2, ~"nyan"); nyan.eat(); diff --git a/src/test/run-pass/conditional-compile.rs b/src/test/run-pass/conditional-compile.rs index 79d0d33bd7c..3d85874b063 100644 --- a/src/test/run-pass/conditional-compile.rs +++ b/src/test/run-pass/conditional-compile.rs @@ -27,12 +27,23 @@ enum tg { bar, } #[cfg(bogus)] struct r { let i: int; - new(i:int) { self.i = i; } +} + +#[cfg(bogus)] +fn r(i:int) -> r { + r { + i: i + } } struct r { let i: int; - new(i:int) { self.i = i; } +} + +fn r(i:int) -> r { + r { + i: i + } } #[cfg(bogus)] diff --git a/src/test/run-pass/explicit-self.rs b/src/test/run-pass/explicit-self.rs index cd9f486c9aa..8872abe1b21 100644 --- a/src/test/run-pass/explicit-self.rs +++ b/src/test/run-pass/explicit-self.rs @@ -34,9 +34,13 @@ fn select_based_on_unit_circle( struct thing { x: {mut a: @int}; - new (x: {mut a: @int}) { self.x = copy x; } } +fn thing(x: {mut a: @int}) -> thing { + thing { + x: copy x + } +} impl thing { fn foo(@self) -> int { *self.x.a } diff --git a/src/test/run-pass/init-res-into-things.rs b/src/test/run-pass/init-res-into-things.rs index 2609080ebc9..d124748c56c 100644 --- a/src/test/run-pass/init-res-into-things.rs +++ b/src/test/run-pass/init-res-into-things.rs @@ -3,12 +3,15 @@ struct r { let i: @mut int; - new(i: @mut int) { - self.i = i; - } drop { *(self.i) = *(self.i) + 1; } } +fn r(i: @mut int) -> r { + r { + i: i + } +} + fn test_box() { let i = @mut 0; { diff --git a/src/test/run-pass/issue-2288.rs b/src/test/run-pass/issue-2288.rs index 52d71e6adcb..dcd460cdea9 100644 --- a/src/test/run-pass/issue-2288.rs +++ b/src/test/run-pass/issue-2288.rs @@ -3,11 +3,16 @@ trait clam { } struct foo : clam { let x: A; - new(b: A) { self.x = b; } fn chowder(y: A) { } } +fn foo(b: A) -> foo { + foo { + x: b + } +} + fn f(x: clam, a: A) { x.chowder(a); } diff --git a/src/test/run-pass/issue-2311-2.rs b/src/test/run-pass/issue-2311-2.rs index 4c8e99ab46f..fbc7a877c81 100644 --- a/src/test/run-pass/issue-2311-2.rs +++ b/src/test/run-pass/issue-2311-2.rs @@ -1,10 +1,15 @@ trait clam { } struct foo { let x: A; - new(b: A) { self.x = b; } fn bar>(c: C) -> B { fail; } } +fn foo(b: A) -> foo { + foo { + x: b + } +} + fn main() { } diff --git a/src/test/run-pass/issue-2445-b.rs b/src/test/run-pass/issue-2445-b.rs index b2f14925481..7ddbf1e1534 100644 --- a/src/test/run-pass/issue-2445-b.rs +++ b/src/test/run-pass/issue-2445-b.rs @@ -1,11 +1,15 @@ struct c1 { let x: T; - new(x: T) {self.x = x;} - fn f1(x: int) { } } +fn c1(x: T) -> c1 { + c1 { + x: x + } +} + impl c1 { fn f2(x: int) { } diff --git a/src/test/run-pass/issue-2445.rs b/src/test/run-pass/issue-2445.rs index d0da8310938..e9d08b579da 100644 --- a/src/test/run-pass/issue-2445.rs +++ b/src/test/run-pass/issue-2445.rs @@ -2,11 +2,15 @@ use dvec::DVec; struct c1 { let x: T; - new(x: T) {self.x = x;} - fn f1(x: T) {} } +fn c1(x: T) -> c1 { + c1 { + x: x + } +} + impl c1 { fn f2(x: T) {} } diff --git a/src/test/run-pass/issue-2487-a.rs b/src/test/run-pass/issue-2487-a.rs index 0cff6b57c2a..837d6f4764c 100644 --- a/src/test/run-pass/issue-2487-a.rs +++ b/src/test/run-pass/issue-2487-a.rs @@ -1,8 +1,6 @@ struct socket { let sock: int; - new() { self.sock = 1; } - drop { } fn set_identity() { @@ -12,6 +10,12 @@ struct socket { } } +fn socket() -> socket { + socket { + sock: 1 + } +} + fn closure(f: fn()) { f() } fn setsockopt_bytes(_sock: int) { } diff --git a/src/test/run-pass/issue-2502.rs b/src/test/run-pass/issue-2502.rs index b554fef4564..fb0e5d1939e 100644 --- a/src/test/run-pass/issue-2502.rs +++ b/src/test/run-pass/issue-2502.rs @@ -1,13 +1,15 @@ struct font { let fontbuf: &self/~[u8]; - new(fontbuf: &self/~[u8]) { - self.fontbuf = fontbuf; - } - fn buf() -> &self/~[u8] { self.fontbuf } } +fn font(fontbuf: &r/~[u8]) -> font/&r { + font { + fontbuf: fontbuf + } +} + fn main() { } diff --git a/src/test/run-pass/issue-2550.rs b/src/test/run-pass/issue-2550.rs index 70af9ca03dc..93e4d13f188 100644 --- a/src/test/run-pass/issue-2550.rs +++ b/src/test/run-pass/issue-2550.rs @@ -1,8 +1,11 @@ struct C { let x: uint; - new(x: uint) { - self.x = x; +} + +fn C(x: uint) -> C { + C { + x: x } } diff --git a/src/test/run-pass/issue-2633.rs b/src/test/run-pass/issue-2633.rs index 96ac83aeee6..b0cf990ce71 100644 --- a/src/test/run-pass/issue-2633.rs +++ b/src/test/run-pass/issue-2633.rs @@ -1,6 +1,11 @@ struct cat { let mut meow: fn@(); - new() { self.meow = fn@() { error!("meow"); };} +} + +fn cat() -> cat { + cat { + meow: fn@() { error!("meow"); } + } } type kitty_info = {kitty: cat}; diff --git a/src/test/run-pass/issue-2708.rs b/src/test/run-pass/issue-2708.rs index 18d9338739c..79e0c3813de 100644 --- a/src/test/run-pass/issue-2708.rs +++ b/src/test/run-pass/issue-2708.rs @@ -3,15 +3,17 @@ struct Font { let cairo_font: uint; let font_dtor: uint; - new() { - self.fontbuf = 0; - self.cairo_font = 0; - self.font_dtor = 0; - } - drop { } } +fn Font() -> Font { + Font { + fontbuf: 0, + cairo_font: 0, + font_dtor: 0 + } +} + fn main() { let _f = @Font(); } diff --git a/src/test/run-pass/issue-2718.rs b/src/test/run-pass/issue-2718.rs index 20dd0c650f1..7af8d3672c2 100644 --- a/src/test/run-pass/issue-2718.rs +++ b/src/test/run-pass/issue-2718.rs @@ -137,7 +137,6 @@ mod pipes { struct send_packet { let mut p: Option<*packet>; - new(p: *packet) { self.p = Some(p); } drop { if self.p != None { let mut p = None; @@ -152,9 +151,14 @@ mod pipes { } } + fn send_packet(p: *packet) -> send_packet { + send_packet { + p: Some(p) + } + } + struct recv_packet { let mut p: Option<*packet>; - new(p: *packet) { self.p = Some(p); } drop { if self.p != None { let mut p = None; @@ -169,6 +173,12 @@ mod pipes { } } + fn recv_packet(p: *packet) -> recv_packet { + recv_packet { + p: Some(p) + } + } + fn entangle() -> (send_packet, recv_packet) { let p = packet(); (send_packet(p), recv_packet(p)) diff --git a/src/test/run-pass/issue-2735-2.rs b/src/test/run-pass/issue-2735-2.rs index eaec723de29..6c99cb0ad2a 100644 --- a/src/test/run-pass/issue-2735-2.rs +++ b/src/test/run-pass/issue-2735-2.rs @@ -1,12 +1,15 @@ // This test should behave exactly like issue-2735-3 struct defer { let b: &mut bool; - new(b: &mut bool) { - self.b = b; - } drop { *(self.b) = true; } } +fn defer(b: &r/mut bool) -> defer/&r { + defer { + b: b + } +} + fn main() { let mut dtor_ran = false; let _ = defer(&mut dtor_ran); diff --git a/src/test/run-pass/issue-2735-3.rs b/src/test/run-pass/issue-2735-3.rs index b41b65cf6df..4d06365e26f 100644 --- a/src/test/run-pass/issue-2735-3.rs +++ b/src/test/run-pass/issue-2735-3.rs @@ -1,12 +1,15 @@ // This test should behave exactly like issue-2735-2 struct defer { let b: &mut bool; - new(b: &mut bool) { - self.b = b; - } drop { *(self.b) = true; } } +fn defer(b: &r/mut bool) -> defer/&r { + defer { + b: b + } +} + fn main() { let mut dtor_ran = false; defer(&mut dtor_ran); diff --git a/src/test/run-pass/issue-2748-a.rs b/src/test/run-pass/issue-2748-a.rs index fb7e10a2b17..1a552946676 100644 --- a/src/test/run-pass/issue-2748-a.rs +++ b/src/test/run-pass/issue-2748-a.rs @@ -1,8 +1,11 @@ struct CMap { let buf: &[u8]; - new(buf: &self/[u8]) { - self.buf = buf; +} + +fn CMap(buf: &r/[u8]) -> CMap/&r { + CMap { + buf: buf } } diff --git a/src/test/run-pass/issue-2936.rs b/src/test/run-pass/issue-2936.rs index 130e59125a1..ddcc0360d8b 100644 --- a/src/test/run-pass/issue-2936.rs +++ b/src/test/run-pass/issue-2936.rs @@ -8,12 +8,17 @@ fn foo>(b: U) -> T { struct cbar : bar { x: int; - new(x: int) { self.x = x; } fn get_bar() -> int { self.x } } +fn cbar(x: int) -> cbar { + cbar { + x: x + } +} + fn main() { let x: int = foo::(cbar(5)); assert x == 5; diff --git a/src/test/run-pass/issue-3220.rs b/src/test/run-pass/issue-3220.rs index da0d3dc91d2..358f0a82a6e 100644 --- a/src/test/run-pass/issue-3220.rs +++ b/src/test/run-pass/issue-3220.rs @@ -1,4 +1,9 @@ -struct thing { x: int; new () { self.x = 0; } drop { } } +struct thing { x: int; drop { } } +fn thing() -> thing { + thing { + x: 0 + } +} impl thing { fn f(self) {} } fn main() { diff --git a/src/test/run-pass/issue-979.rs b/src/test/run-pass/issue-979.rs index 0b66943b8ea..dd12d391abd 100644 --- a/src/test/run-pass/issue-979.rs +++ b/src/test/run-pass/issue-979.rs @@ -1,11 +1,14 @@ struct r { let b: @mut int; - new(b: @mut int) { - self.b = b; - } drop { *(self.b) += 1; } } +fn r(b: @mut int) -> r { + r { + b: b + } +} + fn main() { let b = @mut 0; { diff --git a/src/test/run-pass/nested-class.rs b/src/test/run-pass/nested-class.rs index cfc3064b552..e2b68db5a48 100644 --- a/src/test/run-pass/nested-class.rs +++ b/src/test/run-pass/nested-class.rs @@ -3,9 +3,14 @@ fn main() { struct b { let i: int; fn do_stuff() -> int { return 37; } - new(i:int) { self.i = i; } } + fn b(i:int) -> b { + b { + i: i + } + } + // fn b(x:int) -> int { fail; } let z = b(42); diff --git a/src/test/run-pass/private-class-field.rs b/src/test/run-pass/private-class-field.rs index a988ad46737..bbe6d59c280 100644 --- a/src/test/run-pass/private-class-field.rs +++ b/src/test/run-pass/private-class-field.rs @@ -6,7 +6,13 @@ struct cat { let how_hungry : int; fn meow_count() -> uint { self.meows } - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/run-pass/private-method.rs b/src/test/run-pass/private-method.rs index 569359a9db1..ab75956bbd8 100644 --- a/src/test/run-pass/private-method.rs +++ b/src/test/run-pass/private-method.rs @@ -10,7 +10,13 @@ struct cat { self.meows += 1u; self.nap(); } - new(in_x : uint, in_y : int) { self.meows = in_x; self.how_hungry = in_y; } +} + +fn cat(in_x : uint, in_y : int) -> cat { + cat { + meows: in_x, + how_hungry: in_y + } } fn main() { diff --git a/src/test/run-pass/resource-assign-is-not-copy.rs b/src/test/run-pass/resource-assign-is-not-copy.rs index 08fc743af80..1a18c788e0d 100644 --- a/src/test/run-pass/resource-assign-is-not-copy.rs +++ b/src/test/run-pass/resource-assign-is-not-copy.rs @@ -1,11 +1,14 @@ struct r { let i: @mut int; - new(i: @mut int) { - self.i = i; - } drop { *(self.i) += 1; } } +fn r(i: @mut int) -> r { + r { + i: i + } +} + fn main() { let i = @mut 0; // Even though these look like copies, they are guaranteed not to be diff --git a/src/test/run-pass/resource-cycle.rs b/src/test/run-pass/resource-cycle.rs index e0d85e4d288..14c7d269752 100644 --- a/src/test/run-pass/resource-cycle.rs +++ b/src/test/run-pass/resource-cycle.rs @@ -2,13 +2,6 @@ struct r { let v: *int; - new(v: *int) unsafe { - self.v = v; - debug!("r's ctor: v = %x, self = %x, self.v = %x", - unsafe::reinterpret_cast::<*int, uint>(&v), - unsafe::reinterpret_cast::<*r, uint>(&ptr::addr_of(self)), - unsafe::reinterpret_cast::<**int, uint>(&ptr::addr_of(self.v))); - } drop unsafe { debug!("r's dtor: self = %x, self.v = %x, self.v's value = %x", unsafe::reinterpret_cast::<*r, uint>(&ptr::addr_of(self)), @@ -17,6 +10,12 @@ struct r { let v2: ~int = unsafe::reinterpret_cast(&self.v); } } +fn r(v: *int) -> r unsafe { + r { + v: v + } +} + enum t = { mut next: Option<@t>, r: r diff --git a/src/test/run-pass/resource-cycle2.rs b/src/test/run-pass/resource-cycle2.rs index c5b69af33d9..25fa567292e 100644 --- a/src/test/run-pass/resource-cycle2.rs +++ b/src/test/run-pass/resource-cycle2.rs @@ -8,12 +8,17 @@ type u = { struct r { let v: u; - new(v: u) { self.v = v; } drop unsafe { let v2: ~int = unsafe::reinterpret_cast(&self.v.c); } } +fn r(v: u) -> r { + r { + v: v + } +} + enum t = { mut next: Option<@t>, r: r diff --git a/src/test/run-pass/resource-cycle3.rs b/src/test/run-pass/resource-cycle3.rs index 36d73bf23e5..ca5ce6f1b7f 100644 --- a/src/test/run-pass/resource-cycle3.rs +++ b/src/test/run-pass/resource-cycle3.rs @@ -12,15 +12,20 @@ struct r { let v: u; let w: int; let x: *int; - new(v: u, w: int, _x: *int) unsafe { self.v = v; self.w = w; - self.x = unsafe::reinterpret_cast(&0); - /* self.x = x; */ } drop unsafe { let _v2: ~int = unsafe::reinterpret_cast(&self.v.c); // let _v3: ~int = unsafe::reinterpret_cast(self.x); } } +fn r(v: u, w: int, _x: *int) -> r unsafe { + r { + v: v, + w: w, + x: unsafe::reinterpret_cast(&0) + } +} + enum t = { mut next: Option<@t>, r: r diff --git a/src/test/run-pass/resource-destruct.rs b/src/test/run-pass/resource-destruct.rs index b935d7f1316..5bd8921ca53 100644 --- a/src/test/run-pass/resource-destruct.rs +++ b/src/test/run-pass/resource-destruct.rs @@ -1,10 +1,15 @@ struct shrinky_pointer { let i: @@mut int; fn look_at() -> int { return **(self.i); } - new(i: @@mut int) { self.i = i; } drop { log(error, ~"Hello!"); **(self.i) -= 1; } } +fn shrinky_pointer(i: @@mut int) -> shrinky_pointer { + shrinky_pointer { + i: i + } +} + fn main() { let my_total = @@mut 10; { let pt <- shrinky_pointer(my_total); assert (pt.look_at() == 10); } diff --git a/src/test/run-pass/resource-generic.rs b/src/test/run-pass/resource-generic.rs index 618848e1edd..79b4242df42 100644 --- a/src/test/run-pass/resource-generic.rs +++ b/src/test/run-pass/resource-generic.rs @@ -1,11 +1,14 @@ struct finish { let arg: {val: T, fin: extern fn(T)}; - new(arg: {val: T, fin: extern fn(T)}) { - self.arg = arg; - } drop { self.arg.fin(self.arg.val); } } +fn finish(arg: {val: T, fin: extern fn(T)}) -> finish { + finish { + arg: arg + } +} + fn main() { let box = @mut 10; fn dec_box(&&i: @mut int) { *i -= 1; } diff --git a/src/test/run-pass/resource-in-struct.rs b/src/test/run-pass/resource-in-struct.rs index 2fbe658fd6c..2660a983941 100644 --- a/src/test/run-pass/resource-in-struct.rs +++ b/src/test/run-pass/resource-in-struct.rs @@ -6,10 +6,15 @@ type closable = @mut bool; struct close_res { let i: closable; - new(i: closable) { self.i = i; } drop { *(self.i) = false; } } +fn close_res(i: closable) -> close_res { + close_res { + i: i + } +} + enum option { none, some(T), } fn sink(res: option) { } diff --git a/src/test/run-pass/send-resource.rs b/src/test/run-pass/send-resource.rs index 40da915e6cd..6fda3c54c38 100644 --- a/src/test/run-pass/send-resource.rs +++ b/src/test/run-pass/send-resource.rs @@ -3,10 +3,15 @@ use comm::*; struct test { let f: int; - new(f: int) { self.f = f; } drop {} } +fn test(f: int) -> test { + test { + f: f + } +} + fn main() { let p = Port(); let c = Chan(p); diff --git a/src/test/run-pass/sendable-class.rs b/src/test/run-pass/sendable-class.rs index 762d510da20..d7daa616abf 100644 --- a/src/test/run-pass/sendable-class.rs +++ b/src/test/run-pass/sendable-class.rs @@ -3,7 +3,13 @@ struct foo { let i: int; let j: char; - new(i:int, j: char) { self.i = i; self.j = j; } +} + +fn foo(i:int, j: char) -> foo { + foo { + i: i, + j: j + } } fn main() { diff --git a/src/test/run-pass/task-killjoin-rsrc.rs b/src/test/run-pass/task-killjoin-rsrc.rs index 3067e6f48ac..df05df61afb 100644 --- a/src/test/run-pass/task-killjoin-rsrc.rs +++ b/src/test/run-pass/task-killjoin-rsrc.rs @@ -7,7 +7,6 @@ use std; struct notify { let ch: comm::Chan; let v: @mut bool; - new(ch: comm::Chan, v: @mut bool) { self.ch = ch; self.v = v; } drop { error!("notify: task=%? v=%x unwinding=%b b=%b", task::get_task(), @@ -19,6 +18,13 @@ struct notify { } } +fn notify(ch: comm::Chan, v: @mut bool) -> notify { + notify { + ch: ch, + v: v + } +} + fn joinable(+f: fn~()) -> comm::Port { fn wrapper(+c: comm::Chan, +f: fn()) { let b = @mut false; diff --git a/src/test/run-pass/type-param-constraints.rs b/src/test/run-pass/type-param-constraints.rs index e049c0ecf38..634bce5cb12 100644 --- a/src/test/run-pass/type-param-constraints.rs +++ b/src/test/run-pass/type-param-constraints.rs @@ -4,10 +4,15 @@ fn u_foo(unique: T) { } struct r { let i: int; - new(i:int) { self.i = i; } drop {} } +fn r(i:int) -> r { + r { + i: i + } +} + fn main() { p_foo(r(10)); p_foo(@r(10)); diff --git a/src/test/run-pass/unique-pinned-nocopy-2.rs b/src/test/run-pass/unique-pinned-nocopy-2.rs index db550ca608e..101f890391e 100644 --- a/src/test/run-pass/unique-pinned-nocopy-2.rs +++ b/src/test/run-pass/unique-pinned-nocopy-2.rs @@ -1,9 +1,14 @@ struct r { let i: @mut int; - new(i: @mut int) { self.i = i; } drop { *(self.i) = *(self.i) + 1; } } +fn r(i: @mut int) -> r { + r { + i: i + } +} + fn main() { let i = @mut 0; { diff --git a/src/test/run-pass/unwind-resource.rs b/src/test/run-pass/unwind-resource.rs index da7d63e9126..f66dfdcfeee 100644 --- a/src/test/run-pass/unwind-resource.rs +++ b/src/test/run-pass/unwind-resource.rs @@ -3,14 +3,18 @@ use std; struct complainer { let c: comm::Chan; - new(c: comm::Chan) { - error!("Hello!"); - self.c = c; } drop { error!("About to send!"); comm::send(self.c, true); error!("Sent!"); } } +fn complainer(c: comm::Chan) -> complainer { + error!("Hello!"); + complainer { + c: c + } +} + fn f(c: comm::Chan) { let _c <- complainer(c); fail; diff --git a/src/test/run-pass/unwind-resource2.rs b/src/test/run-pass/unwind-resource2.rs index c070bbb1ca2..ff1758ceef1 100644 --- a/src/test/run-pass/unwind-resource2.rs +++ b/src/test/run-pass/unwind-resource2.rs @@ -3,10 +3,15 @@ use std; struct complainer { let c: @int; - new(c: @int) { self.c = c; } drop {} } +fn complainer(c: @int) -> complainer { + complainer { + c: c + } +} + fn f() { let c <- complainer(@0); fail; diff --git a/src/test/run-pass/vec-slice-drop.rs b/src/test/run-pass/vec-slice-drop.rs index 771fb946211..1461e8960b4 100644 --- a/src/test/run-pass/vec-slice-drop.rs +++ b/src/test/run-pass/vec-slice-drop.rs @@ -1,10 +1,15 @@ // Make sure that destructors get run on slice literals struct foo { let x: @mut int; - new(x: @mut int) { self.x = x; } drop { *self.x += 1; } } +fn foo(x: @mut int) -> foo { + foo { + x: x + } +} + fn main() { let x = @mut 0; {