| // I, Howard Hinnant, hereby place this code in the public domain. |
| |
| // Test that the implicit object parameter is *not* an rvalue reference, but is instead |
| // identical to that specified in C++03. That is, the implicit object parameter is |
| // an lvalue reference that can bind to an rvalue. :-\ |
| // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html under the |
| // section "Revision 1 Summary and Rationale" for more details. |
| |
| // { dg-do compile { target c++11 } } |
| // { dg-skip-if "packed attribute missing for struct one" { "epiphany-*-*" } } |
| |
| template <bool> struct sa; |
| template <> struct sa<true> {}; |
| |
| struct one {long x[1];}; |
| struct two {long x[2];}; |
| |
| struct os |
| { |
| one operator<<(int); |
| }; |
| |
| struct A |
| { |
| A(int); |
| }; |
| |
| two operator<<(os&, const A&); |
| |
| void test() |
| { |
| os o; |
| sa<sizeof(o << 1) == 1 * sizeof(long)> t1; // Calls os::operator<<(int) |
| // Would be ambiguous if the implicit object parameter |
| // was an rvalue reference. |
| } |
| |
| int main() |
| { |
| return 0; |
| } |