// I, Howard Hinnant, hereby place this code in the public domain. // Test the "Augmented" template argument deduction when binding an lvalue to an rvalue reference. // { 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 void test1(T&&) { sa::value == is_lvalue_ref> t1; sa::value == is_rvalue_ref> t2; } template void test2(const T&&) // { dg-error "argument" } { sa::value == is_lvalue_ref> t1; sa::value == is_rvalue_ref> t2; } template void test3(T*&&) { sa::value == is_lvalue_ref> t1; sa::value == is_rvalue_ref> t2; } struct A {}; A a; A source() {return A();} A* sourcep() {return 0;} int main() { test1(a); test1(source()); test2(a); // { dg-error "lvalue" } test2(source()); test3(&a); test3(sourcep()); return 0; }