// Copyright 2014 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.

// aux-build:pub_and_stability.rs

#![feature(unused_feature)]

// A big point of this test is that we *declare* `unstable_declared`,
// but do *not* declare `unstable_undeclared`. This way we can check
// that the compiler is letting in uses of declared feature-gated
// stuff but still rejecting uses of undeclared feature-gated stuff.
#![feature(unstable_declared)]

extern crate pub_and_stability;
use pub_and_stability::{Record, Trait, Tuple};

fn main() {
    // Okay
    let Record { .. } = Record::new();

    // Okay
    let Record { a_stable_pub: _, a_unstable_declared_pub: _, .. } = Record::new();

    let Record { a_stable_pub: _, a_unstable_declared_pub: _, a_unstable_undeclared_pub: _, .. } =
        Record::new();
    //~^^ ERROR use of unstable library feature 'unstable_undeclared'

    let r = Record::new();
    let t = Tuple::new();

    r.a_stable_pub;
    r.a_unstable_declared_pub;
    r.a_unstable_undeclared_pub; //~ ERROR use of unstable library feature
    r.b_crate;                   //~ ERROR is private
    r.c_mod;                     //~ ERROR is private
    r.d_priv;                    //~ ERROR is private

    t.0;
    t.1;
    t.2;                         //~ ERROR use of unstable library feature
    t.3;                         //~ ERROR is private
    t.4;                         //~ ERROR is private
    t.5;                         //~ ERROR is private

    r.stable_trait_method();
    r.unstable_declared_trait_method();
    r.unstable_undeclared_trait_method(); //~ ERROR use of unstable library feature

    r.stable();
    r.unstable_declared();
    r.unstable_undeclared();              //~ ERROR use of unstable library feature

    r.pub_crate();                        //~ ERROR `pub_crate` is private
    r.pub_mod();                          //~ ERROR `pub_mod` is private
    r.private();                          //~ ERROR `private` is private

    let t = Tuple::new();
    t.stable_trait_method();
    t.unstable_declared_trait_method();
    t.unstable_undeclared_trait_method(); //~ ERROR use of unstable library feature

    t.stable();
    t.unstable_declared();
    t.unstable_undeclared();              //~ ERROR use of unstable library feature

    t.pub_crate();                        //~ ERROR `pub_crate` is private
    t.pub_mod();                          //~ ERROR `pub_mod` is private
    t.private();                          //~ ERROR `private` is private

}
