// { dg-do compile { target c++11 } } template struct is_same { static const bool value = false; }; template struct is_same { static const bool value = true; }; #define CHECK_DECLTYPE(DECLTYPE,RESULT) \ static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT) struct A {}; int a; int& b = a; const int& c = a; const int d = 5; const A e = A(); CHECK_DECLTYPE(decltype(a), int); CHECK_DECLTYPE(decltype(b), int&); CHECK_DECLTYPE(decltype(c), const int&); CHECK_DECLTYPE(decltype(d), const int); CHECK_DECLTYPE(decltype(e), const A); CHECK_DECLTYPE(decltype(a), int); CHECK_DECLTYPE(decltype((a)), int&); void foo_check(int a, int& b, float& c, int* d) { CHECK_DECLTYPE(decltype(a), int); CHECK_DECLTYPE(decltype(b), int&); CHECK_DECLTYPE(decltype(c), float&); CHECK_DECLTYPE(decltype(d), int*); } int foo(char); int bar(char); int bar(int); CHECK_DECLTYPE(decltype(foo), int(char)); decltype(bar) z; // { dg-error "overload" "overload" } // { dg-error "invalid type" "invalid" { target *-*-* } 47 } CHECK_DECLTYPE(decltype(&foo), int(*)(char)); CHECK_DECLTYPE(decltype(*&foo), int(&)(char)); void array_types() { int a[10]; CHECK_DECLTYPE(decltype(a), int[10]); }