parent
5ef6182102
commit
180ef47af2
37
src/test/compile-fail/dropck_no_diverge_on_nonregular_1.rs
Normal file
37
src/test/compile-fail/dropck_no_diverge_on_nonregular_1.rs
Normal file
@ -0,0 +1,37 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// Issue 22443: Reject code using non-regular types that would
|
||||
// otherwise cause dropck to loop infinitely.
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
struct Digit<T> {
|
||||
elem: T
|
||||
}
|
||||
|
||||
struct Node<T:'static> { m: PhantomData<&'static T> }
|
||||
|
||||
|
||||
enum FingerTree<T:'static> {
|
||||
Single(T),
|
||||
// Bug report said Digit after Box would stack overflow (versus
|
||||
// Digit before Box; see dropck_no_diverge_on_nonregular_2).
|
||||
Deep(
|
||||
Box<FingerTree<Node<T>>>,
|
||||
Digit<T>,
|
||||
)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let ft = //~ ERROR overflow while adding drop-check rules for FingerTree
|
||||
FingerTree::Single(1);
|
||||
//~^ ERROR overflow while adding drop-check rules for FingerTree
|
||||
}
|
36
src/test/compile-fail/dropck_no_diverge_on_nonregular_2.rs
Normal file
36
src/test/compile-fail/dropck_no_diverge_on_nonregular_2.rs
Normal file
@ -0,0 +1,36 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// Issue 22443: Reject code using non-regular types that would
|
||||
// otherwise cause dropck to loop infinitely.
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
struct Digit<T> {
|
||||
elem: T
|
||||
}
|
||||
|
||||
struct Node<T:'static> { m: PhantomData<&'static T> }
|
||||
|
||||
enum FingerTree<T:'static> {
|
||||
Single(T),
|
||||
// Bug report said Digit before Box would infinite loop (versus
|
||||
// Digit after Box; see dropck_no_diverge_on_nonregular_1).
|
||||
Deep(
|
||||
Digit<T>,
|
||||
Box<FingerTree<Node<T>>>,
|
||||
)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let ft = //~ ERROR overflow while adding drop-check rules for FingerTree
|
||||
FingerTree::Single(1);
|
||||
//~^ ERROR overflow while adding drop-check rules for FingerTree
|
||||
}
|
46
src/test/compile-fail/dropck_no_diverge_on_nonregular_3.rs
Normal file
46
src/test/compile-fail/dropck_no_diverge_on_nonregular_3.rs
Normal file
@ -0,0 +1,46 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// Issue 22443: Reject code using non-regular types that would
|
||||
// otherwise cause dropck to loop infinitely.
|
||||
//
|
||||
// This version is just checking that we still sanely handle a trivial
|
||||
// wrapper around the non-regular type. (It also demonstrates how the
|
||||
// error messages will report different types depending on which type
|
||||
// dropck is analyzing.)
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
struct Digit<T> {
|
||||
elem: T
|
||||
}
|
||||
|
||||
struct Node<T:'static> { m: PhantomData<&'static T> }
|
||||
|
||||
enum FingerTree<T:'static> {
|
||||
Single(T),
|
||||
// According to the bug report, Digit before Box would infinite loop.
|
||||
Deep(
|
||||
Digit<T>,
|
||||
Box<FingerTree<Node<T>>>,
|
||||
)
|
||||
}
|
||||
|
||||
enum Wrapper<T:'static> {
|
||||
Simple,
|
||||
Other(FingerTree<T>),
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let w = //~ ERROR overflow while adding drop-check rules for core::option
|
||||
Some(Wrapper::Simple::<u32>);
|
||||
//~^ ERROR overflow while adding drop-check rules for core::option::Option
|
||||
//~| ERROR overflow while adding drop-check rules for Wrapper
|
||||
}
|
55
src/test/run-pass/issue-22777.rs
Normal file
55
src/test/run-pass/issue-22777.rs
Normal file
@ -0,0 +1,55 @@
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This test is reduced from libsyntax. It is just checking that we
|
||||
// can successfully deal with a "deep" structure, which the drop-check
|
||||
// was hitting a recursion limit on at one point.
|
||||
|
||||
#![allow(non_camel_case_types)]
|
||||
|
||||
pub fn noop_fold_impl_item() -> SmallVector<ImplItem> {
|
||||
loop { }
|
||||
}
|
||||
|
||||
pub struct SmallVector<T>(P<T>);
|
||||
pub struct ImplItem(P<S01_Method>);
|
||||
|
||||
struct P<T>(Box<T>);
|
||||
|
||||
struct S01_Method(P<S02_Generics>);
|
||||
struct S02_Generics(P<S03_TyParam>);
|
||||
struct S03_TyParam(P<S04_TyParamBound>);
|
||||
struct S04_TyParamBound(S05_PolyTraitRef);
|
||||
struct S05_PolyTraitRef(S06_TraitRef);
|
||||
struct S06_TraitRef(S07_Path);
|
||||
struct S07_Path(Vec<S08_PathSegment>);
|
||||
struct S08_PathSegment(S09_PathParameters);
|
||||
struct S09_PathParameters(P<S10_ParenthesizedParameterData>);
|
||||
struct S10_ParenthesizedParameterData(Option<P<S11_Ty>>);
|
||||
struct S11_Ty(P<S12_Expr>);
|
||||
struct S12_Expr(P<S13_Block>);
|
||||
struct S13_Block(Vec<P<S14_Stmt>>);
|
||||
struct S14_Stmt(P<S15_Decl>);
|
||||
struct S15_Decl(P<S16_Local>);
|
||||
struct S16_Local(P<S17_Pat>);
|
||||
struct S17_Pat(P<S18_Mac>);
|
||||
struct S18_Mac(Vec<P<S19_TokenTree>>);
|
||||
struct S19_TokenTree(P<S20_Token>);
|
||||
struct S20_Token(P<S21_Nonterminal>);
|
||||
struct S21_Nonterminal(P<S22_Item>);
|
||||
struct S22_Item(P<S23_EnumDef>);
|
||||
struct S23_EnumDef(Vec<P<S24_Variant>>);
|
||||
struct S24_Variant(P<S25_VariantKind>);
|
||||
struct S25_VariantKind(P<S26_StructDef>);
|
||||
struct S26_StructDef(Vec<P<S27_StructField>>);
|
||||
struct S27_StructField(P<S28_StructFieldKind>);
|
||||
struct S28_StructFieldKind;
|
||||
|
||||
pub fn main() {}
|
Loading…
Reference in New Issue
Block a user