Example #1
0
int main()
{
    struct A *p;
    if (local.a != 1 || local.b != 2 || local.c != 3)
        abort ();
    if (a1.a != 4 || a1.b != 5 || a1.c != 6)
        abort ();
    if (a2.a != 22 || a2.b != 23 || a2.c != 24)
        abort ();
    if (a3.a != 10 || a3.b != 11 || a3.c != 12)
        abort ();
    if (a4.a != 25 || a4.b != 26 || a4.c != 27)
        abort ();
    check1 ();
    check2 ();
    if (f1a () != &a1 || f2a () != &a2 || f3a () != &a3 || f4a () != &a4)
        abort ();
    CHECK (5, 16);
    CHECK (6, 19);
    if (f7a () != &a2 || f8a () != &a4)
        abort ();
    CHECK (9, 28);
    CHECK (10, 31);
    exit (0);
}
Example #2
0
decltype(auto) &f9(); // expected-error {{cannot form reference to 'decltype(auto)'}}
decltype(auto) (&f10())[10]; // expected-error {{cannot form array of 'decltype(auto)'}}

decltype(auto) ((((((v1)))))) = 0; // ok
decltype(auto) v2[1] = { 0 }; // expected-error {{cannot form array of 'decltype(auto)'}}
decltype(auto) &v3 = { 0 }; // expected-error {{cannot form reference to 'decltype(auto)'}}
decltype(auto) *v4 = { 0 }; // expected-error {{cannot form pointer to 'decltype(auto)'}}
decltype(auto) v5 = &overloaded_fn; // expected-error {{could not be resolved}}

auto multi1a = 0, &multi1b = multi1a;
auto multi1c = multi1a, multi1d = multi1b;
decltype(auto) multi1e = multi1a, multi1f = multi1b; // expected-error {{'decltype(auto)' deduced as 'int' in declaration of 'multi1e' and deduced as 'int &' in declaration of 'multi1f'}}

auto f1a() { return 0; }
decltype(auto) f1d() { return 0; }
using Int = decltype(f1a());
using Int = decltype(f1d());

auto f2a(int n) { return n; }
decltype(auto) f2d(int n) { return n; }
using Int = decltype(f2a(0));
using Int = decltype(f2d(0));

auto f3a(int n) { return (n); }
decltype(auto) f3d(int n) { return (n); } // expected-warning {{reference to stack memory}}
using Int = decltype(f3a(0));
using IntLRef = decltype(f3d(0));

auto f4a(int n) { return f(); }
decltype(auto) f4d(int n) { return f(); }
using Int = decltype(f4a(0));