Home | History | Annotate | Download | only in dcl.spec.auto
      1 // RUN: %clang_cc1 -verify -std=c++1y %s
      2 
      3 namespace std {
      4   template<typename T> struct initializer_list {
      5     const T *p;
      6     unsigned long n;
      7     initializer_list(const T *p, unsigned long n);
      8   };
      9 }
     10 
     11 int i;
     12 int &&f();
     13 
     14 template <typename T>
     15 void overloaded_fn(T); // expected-note {{possible target}}
     16 
     17 using Int = int;
     18 using IntLRef = int&;
     19 using IntRRef = int&&;
     20 using InitListInt = std::initializer_list<int>;
     21 using IntPtr = int*;
     22 
     23 auto x3a = i;
     24 decltype(auto) x3d = i;
     25 using Int = decltype(x3a);
     26 using Int = decltype(x3d);
     27 
     28 auto x4a = (i);
     29 decltype(auto) x4d = (i);
     30 using Int = decltype(x4a);
     31 using IntLRef = decltype(x4d);
     32 
     33 auto x5a = f();
     34 decltype(auto) x5d = f();
     35 using Int = decltype(x5a);
     36 using IntRRef = decltype(x5d);
     37 
     38 auto x6a = { 1, 2 };
     39 decltype(auto) x6d = { 1, 2 }; // expected-error {{cannot deduce 'decltype(auto)' from initializer list}}
     40 using InitListInt = decltype(x6a);
     41 
     42 auto *x7a = &i;
     43 decltype(auto) *x7d = &i; // expected-error {{cannot form pointer to 'decltype(auto)'}}
     44 using IntPtr = decltype(x7a);
     45 
     46 struct S {};
     47 
     48 decltype(auto) f1();
     49 decltype(auto) (*f2)(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} expected-error {{requires an initializer}}
     50 decltype(auto) *f3(); // expected-error {{cannot form pointer to 'decltype(auto)'}}
     51 const decltype(auto) f4(); // expected-error {{'decltype(auto)' cannot be combined with other type specifiers}}
     52 typedef decltype(auto) f5(); // expected-error {{'decltype(auto)' not allowed in typedef}}
     53 decltype(auto) ((((((f6))))())); // ok
     54 decltype(auto) f7()(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} expected-error {{function cannot return function type}}
     55 decltype(auto) (S::*f8)(); // expected-error {{'decltype(auto)' can only be used as a return type in a function declaration}} expected-error {{requires an initializer}}
     56 decltype(auto) &f9(); // expected-error {{cannot form reference to 'decltype(auto)'}}
     57 decltype(auto) (&f10())[10]; // expected-error {{cannot form array of 'decltype(auto)'}}
     58 
     59 decltype(auto) ((((((v1)))))) = 0; // ok
     60 decltype(auto) v2[1] = { 0 }; // expected-error {{cannot form array of 'decltype(auto)'}}
     61 decltype(auto) &v3 = { 0 }; // expected-error {{cannot form reference to 'decltype(auto)'}}
     62 decltype(auto) *v4 = { 0 }; // expected-error {{cannot form pointer to 'decltype(auto)'}}
     63 decltype(auto) v5 = &overloaded_fn; // expected-error {{could not be resolved}}
     64 
     65 auto multi1a = 0, &multi1b = multi1a;
     66 auto multi1c = multi1a, multi1d = multi1b;
     67 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'}}
     68 
     69 auto f1a() { return 0; }
     70 decltype(auto) f1d() { return 0; }
     71 using Int = decltype(f1a());
     72 using Int = decltype(f1d());
     73 
     74 auto f2a(int n) { return n; }
     75 decltype(auto) f2d(int n) { return n; }
     76 using Int = decltype(f2a(0));
     77 using Int = decltype(f2d(0));
     78 
     79 auto f3a(int n) { return (n); }
     80 decltype(auto) f3d(int n) { return (n); } // expected-warning {{reference to stack memory}}
     81 using Int = decltype(f3a(0));
     82 using IntLRef = decltype(f3d(0));
     83 
     84 auto f4a(int n) { return f(); }
     85 decltype(auto) f4d(int n) { return f(); }
     86 using Int = decltype(f4a(0));
     87 using IntRRef = decltype(f4d(0));
     88 
     89 auto f5aa(int n) { auto x = f(); return x; }
     90 auto f5ad(int n) { decltype(auto) x = f(); return x; }
     91 decltype(auto) f5da(int n) { auto x = f(); return x; }
     92 decltype(auto) f5dd(int n) { decltype(auto) x = f(); return x; } // expected-error {{rvalue reference to type 'int' cannot bind to lvalue}}
     93 using Int = decltype(f5aa(0));
     94 using Int = decltype(f5ad(0));
     95 using Int = decltype(f5da(0));
     96 
     97 auto init_list_1() { return { 1, 2, 3 }; } // expected-error {{cannot deduce return type from initializer list}}
     98 decltype(auto) init_list_2() { return { 1, 2, 3 }; } // expected-error {{cannot deduce return type from initializer list}}
     99