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); }
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));