// I, Howard Hinnant, hereby place this code in the public domain. // Test the reference collapsing rules. Note that there are recent differences // for how cv-qualifications are applied to reference types. 7.1.3, 14.3.1 // { dg-do compile } // { dg-options "-std=c++0x" } template struct sa; template <> struct sa {}; template struct integral_constant { static const T value = v; typedef T value_type; typedef integral_constant type; }; typedef integral_constant true_type; typedef integral_constant false_type; template struct is_lvalue_reference : public integral_constant {}; template struct is_lvalue_reference : public integral_constant {}; template struct is_rvalue_reference : public integral_constant {}; template struct is_rvalue_reference : public integral_constant {}; template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; template struct is_const : public integral_constant {}; template struct is_const : public integral_constant {}; template struct is_volatile : public integral_constant {}; template struct is_volatile : public integral_constant {}; struct A {}; typedef A& Alref; typedef const A& cAlref; typedef volatile A& vAlref; typedef const volatile A& cvAlref; typedef A&& Arref; typedef const A&& cArref; typedef volatile A&& vArref; typedef const volatile A&& cvArref; template void test() { sa::value == is_lvalue_ref> t1; sa::value == is_rvalue_ref> t2; sa::type>::value == s_const> t3; sa::type>::value == s_volatile> t4; sa::type>::value == s_const > t5; sa::type>::value == s_volatile> t6; } int main() { // sanity check test< A&, true, false, false, false>(); test(); test< volatile A&, true, false, false, true>(); test(); test< A&&, false, true, false, false>(); test(); test< volatile A&&, false, true, false, true>(); test(); // lvalue reference test // Alref test< Alref&, true, false, false, false>(); test(); test< volatile Alref&, true, false, false, false>(); test(); // cAlref test< cAlref&, true, false, true, false>(); test(); test< volatile cAlref&, true, false, true, false>(); test(); // vAlref test< vAlref&, true, false, false, true>(); test(); test< volatile vAlref&, true, false, false, true>(); test(); // cvAlref test< cvAlref&, true, false, true, true>(); test(); test< volatile cvAlref&, true, false, true, true>(); test(); // Arref test< Arref&, true, false, false, false>(); test(); test< volatile Arref&, true, false, false, false>(); test(); // cArref test< cArref&, true, false, true, false>(); test(); test< volatile cArref&, true, false, true, false>(); test(); // vArref test< vArref&, true, false, false, true>(); test(); test< volatile vArref&, true, false, false, true>(); test(); // vArref test< cvArref&, true, false, true, true>(); test(); test< volatile cvArref&, true, false, true, true>(); test(); // rvalue reference test // Alref test< Alref&&, true, false, false, false>(); test(); test< volatile Alref&&, true, false, false, false>(); test(); // cAlref test< cAlref&&, true, false, true, false>(); test(); test< volatile cAlref&&, true, false, true, false>(); test(); // vAlref test< vAlref&&, true, false, false, true>(); test(); test< volatile vAlref&&, true, false, false, true>(); test(); // cvAlref test< cvAlref&&, true, false, true, true>(); test(); test< volatile cvAlref&&, true, false, true, true>(); test(); // Arref test< Arref&&, false, true, false, false>(); test(); test< volatile Arref&&, false, true, false, false>(); test(); // cArref test< cArref&&, false, true, true, false>(); test(); test< volatile cArref&&, false, true, true, false>(); test(); // vArref test< vArref&&, false, true, false, true>(); test(); test< volatile vArref&&, false, true, false, true>(); test(); // cvArref test< cvArref&&, false, true, true, true>(); test(); test< volatile cvArref&&, false, true, true, true>(); test(); return 0; }