// Copyright (C) 2016 Free Software Foundation, Inc.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_assignments)]

fn f2() {
    println!("::f2");
}

pub struct Generic<T>(T);

pub struct Type;

pub mod mod1 {
    pub struct Type(usize, isize);

    pub mod inner {
        pub struct Type(f64);

        pub mod innest {
            pub struct Type {pub x : u32}

            fn wrap<T> (x: T) -> ::Generic<::Generic<T>> {
                ::Generic(::Generic(x))
            }

            pub fn f1 () {
                struct Type(i8);

                let x: u8 = 0;

                let ct = ::Type;
                let ctg = wrap(ct);
                let m1t = ::mod1::Type(23, 97);
                let m1tg = wrap(m1t);
                let innert = super::Type(10101.5);
                let innertg = wrap(innert);
                let innestt = self::Type{x: 0xfff};
                let innesttg = wrap(innestt);
                let f1t = Type(9);
                let f1tg = wrap(f1t);

                let f2 = || println!("lambda f2");

                f2();           // set breakpoint here
                f3();
                self::f2();
                super::f2();
                self::super::f2();
                self::super::super::f2();
                super::super::f2();
                ::f2();
            }

            pub fn f2() {
                println!("mod1::inner::innest::f2");
            }

            pub fn f3() {
                println!("mod1::inner::innest::f3");
            }
        }

        pub fn f2() {
            println!("mod1::inner::f2");
        }
    }

    pub fn f2() {
        println!("mod1::f2");
    }
}

fn main () {
    mod1::inner::innest::f1();
}
