blob: 9765857efb199958223f8db6bcb9f256fc06d67c [file] [log] [blame]
// PR c++/103403
// { dg-do compile { target c++14 } }
struct false_type { static constexpr bool value = false; };
struct true_type { static constexpr bool value = true; };
template<class T, class U>
struct is_same : false_type {};
template<class T>
struct is_same<T, T> : true_type {};
int fn ();
int &ref ();
int &&rref ();
struct S {
int i;
int &r = i;
};
void
ids ()
{
const S *s = new S();
int i;
int &ir = i;
decltype(auto) r1 = s->i;
static_assert (is_same<decltype(r1), int>::value, "");
decltype(auto) r2 = s->r;
static_assert (is_same<decltype(r2), int&>::value, "");
decltype(auto) r3 = i;
static_assert (is_same<decltype(r3), int>::value, "");
decltype(auto) r4 = ir;
static_assert (is_same<decltype(r4), int&>::value, "");
}
void
nonids ()
{
const S *s = new S();
int i;
int &ir = i;
int &&irr = 42;
decltype(auto) r1 = fn ();
static_assert (is_same<decltype(r1), int>::value, "");
decltype(auto) r2 = (fn ());
static_assert (is_same<decltype(r2), int>::value, "");
decltype(auto) r3 = ref ();
static_assert (is_same<decltype(r3), int&>::value, "");
decltype(auto) r4 = (ref ());
static_assert (is_same<decltype(r4), int&>::value, "");
decltype(auto) r5 = rref ();
static_assert (is_same<decltype(r5), int&&>::value, "");
decltype(auto) r6 = (rref ());
static_assert (is_same<decltype(r6), int&&>::value, "");
decltype(auto) r8 = (s->i);
static_assert (is_same<decltype(r8), const int&>::value, "");
decltype(auto) r9 = (s->r);
static_assert (is_same<decltype(r9), int&>::value, "");
decltype(auto) r10 = (i);
static_assert (is_same<decltype(r10), int&>::value, "");
decltype(auto) r11 = (ir);
static_assert (is_same<decltype(r11), int&>::value, "");
decltype(auto) r12 = (irr);
static_assert (is_same<decltype(r12), int&>::value, "");
}