expression-traits.cpp revision 9c0e1ec7b3afd833c1b958ce2aeedff71c7eb4c5
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -verify -fcxx-exceptions %s 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for "expression traits" intrinsics such as __is_lvalue_expr. 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// For the time being, these tests are written against the 2003 C++ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// standard (ISO/IEC 14882:2003 -- see draft at 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2001/n1316/). 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++0x has its own, more-refined, idea of lvalues and rvalues. 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// If/when we need to support those, we'll need to track both 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// standard documents. 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if !__has_feature(cxx_static_assert) 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# define CONCAT_(X_, Y_) CONCAT1_(X_, Y_) 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# define CONCAT1_(X_, Y_) X_ ## Y_ 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// This emulation can be used multiple times on one line (and thus in 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// a macro), except at class scope 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define static_assert(b_, m_) \ 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef int CONCAT_(sa_, __LINE__)[b_ ? 1 : -1] 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests are broken down according to section of the C++03 standard 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (ISO/IEC 14882:2003(E)) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertion macros encoding the following two paragraphs 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// basic.lval/1 Every expression is either an lvalue or an rvalue. 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expr.prim/5 A parenthesized expression is a primary expression whose type 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// and value are identical to those of the enclosed expression. The 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// presence of parentheses does not affect whether the expression is 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an lvalue. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: these asserts cannot be made at class scope in C++03. Put 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them in a member function instead. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASSERT_LVALUE(expr) \ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(__is_lvalue_expr(expr), "should be an lvalue"); \ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(__is_lvalue_expr((expr)), \ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "the presence of parentheses should have" \ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " no effect on lvalueness (expr.prim/5)"); \ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(!__is_rvalue_expr(expr), "should be an lvalue"); \ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(!__is_rvalue_expr((expr)), \ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "the presence of parentheses should have" \ 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " no effect on lvalueness (expr.prim/5)") 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASSERT_RVALUE(expr); \ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(__is_rvalue_expr(expr), "should be an rvalue"); \ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(__is_rvalue_expr((expr)), \ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "the presence of parentheses should have" \ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " no effect on lvalueness (expr.prim/5)"); \ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(!__is_lvalue_expr(expr), "should be an rvalue"); \ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_assert(!__is_lvalue_expr((expr)), \ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "the presence of parentheses should have" \ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " no effect on lvalueness (expr.prim/5)") 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum Enum { Enumerator }; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ReturnInt(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReturnVoid(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Enum ReturnEnum(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void basic_lval_5() 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // basic.lval/5: The result of calling a function that does not return 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a reference is an rvalue. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(ReturnInt()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(ReturnVoid()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_RVALUE(ReturnEnum()); 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int& ReturnIntReference(); 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)extern Enum& ReturnEnumReference(); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid basic_lval_6() 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // basic.lval/6: An expression which holds a temporary object resulting 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // from a cast to a nonreference type is an rvalue (this includes 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the explicit creation of an object using functional notation 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct IntClass 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit IntClass(int = 0); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IntClass(char const*); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator int() const; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ConvertibleToIntClass 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) operator IntClass() const; 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertibleToIntClass b; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure even trivial conversions are not detected as lvalues 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int intLvalue = 0; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE((int)intLvalue); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE((short)intLvalue); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE((long)intLvalue); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same tests with function-call notation 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(int(intLvalue)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(short(intLvalue)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(long(intLvalue)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char charLValue = 'x'; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_RVALUE((signed char)charLValue); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_RVALUE((unsigned char)charLValue); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(static_cast<int>(IntClass())); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IntClass intClassLValue; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(static_cast<int>(intClassLValue)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(static_cast<IntClass>(ConvertibleToIntClass())); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertibleToIntClass convertibleToIntClassLValue; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(static_cast<IntClass>(convertibleToIntClassLValue)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef signed char signed_char; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef unsigned char unsigned_char; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(signed_char(charLValue)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(unsigned_char(charLValue)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(int(IntClass())); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_RVALUE(int(intClassLValue)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(IntClass(ConvertibleToIntClass())); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(IntClass(convertibleToIntClassLValue)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void conv_ptr_1() 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // conv.ptr/1: A null pointer constant is an integral constant 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expression (5.19) rvalue of integer type that evaluates to 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // zero. 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_RVALUE(0); 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void expr_6() 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr/6: If an expression initially has the type "reference to T" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (8.3.2, 8.5.3), ... the expression is an lvalue. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = 0; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int& referenceToInt = x; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(referenceToInt); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(ReturnIntReference()); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_prim_2() 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5.1/2 A string literal is an lvalue; all other 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // literals are rvalues. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE("foo"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(1); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_RVALUE(1.2); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_RVALUE(10UL); 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void expr_prim_3() 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){ 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 5.1/3: The keyword "this" names a pointer to the object for 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // which a nonstatic member function (9.3.2) is invoked. ...The 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // expression is an rvalue. 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) struct ThisTest 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void f() { ASSERT_RVALUE(this); } 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern int variable; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Function(); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BaseClass 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~BaseClass(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int BaseNonstaticMemberFunction(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int BaseStaticMemberFunction(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int baseDataMember; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Class : BaseClass 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void function(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int variable; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <class T> 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct NestedClassTemplate {}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch template <class T> 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static int& NestedFuncTemplate() { return variable; } // expected-note{{possible target for call}} 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch template <class T> 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int& NestedMemfunTemplate() { return variable; } 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int operator*() const; 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci template <class T> 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int operator+(T) const; 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int NonstaticMemberFunction(); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static int StaticMemberFunction(); 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int dataMember; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int& referenceDataMember; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int& staticReferenceDataMember; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static int staticNonreferenceDataMember; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Enum { Enumerator }; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operator long() const; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Class(); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Class(int,int); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void expr_prim_4() 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 5.1/4: The operator :: followed by an identifier, a 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // qualified-id, or an operator-function-id is a primary- 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // expression. ...The result is an lvalue if the entity is 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a function or variable. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(::Function); // identifier: function 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(::variable); // identifier: variable 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the only qualified-id form that can start without "::" (and thus 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be legal after "::" ) is 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ::<sub>opt</sub> nested-name-specifier template<sub>opt</sub> unqualified-id 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(::Class::function); // qualified-id: function 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(::Class::variable); // qualified-id: variable 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The standard doesn't give a clear answer about whether these 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should really be lvalues or rvalues without some surrounding 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // context that forces them to be interpreted as naming a 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // particular function template specialization (that situation 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // doesn't come up in legal pure C++ programs). This language 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension simply rejects them as requiring additional context 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __is_lvalue_expr(::Class::NestedFuncTemplate); // qualified-id: template \ 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // expected-error{{reference to overloaded function could not be resolved; did you mean to call it?}} 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __is_lvalue_expr(::Class::NestedMemfunTemplate); // qualified-id: template \ 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // expected-error{{reference to non-static member function must be called}} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) __is_lvalue_expr(::Class::operator+); // operator-function-id: template \ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expected-error{{reference to non-static member function must be called}} 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //ASSERT_RVALUE(::Class::operator*); // operator-function-id: member function 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void expr_prim_7() 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // expr.prim/7 An identifier is an id-expression provided it has been 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // suitably declared (clause 7). [Note: ... ] The type of the 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // expression is the type of the identifier. The result is the 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // entity denoted by the identifier. The result is an lvalue if 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the entity is a function, variable, or data member... (cont'd) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(Function); // identifier: function 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_LVALUE(StaticMemberFunction); // identifier: function 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(variable); // identifier: variable 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(dataMember); // identifier: data member 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) //ASSERT_RVALUE(NonstaticMemberFunction); // identifier: member function 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (cont'd)...A nested-name-specifier that names a class, 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // optionally followed by the keyword template (14.2), and then 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // followed by the name of a member of either that class (9.2) or 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one of its base classes... is a qualified-id... The result is 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the member. The type of the result is the type of the 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // member. The result is an lvalue if the member is a static 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // member function or a data member. 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LVALUE(Class::dataMember); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LVALUE(Class::StaticMemberFunction); 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) //ASSERT_RVALUE(Class::NonstaticMemberFunction); // identifier: member function 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_LVALUE(Class::baseDataMember); 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LVALUE(Class::BaseStaticMemberFunction); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //ASSERT_RVALUE(Class::BaseNonstaticMemberFunction); // identifier: member function 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void expr_call_10() 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // expr.call/10: A function call is an lvalue if and only if the 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // result type is a reference. This statement is partially 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redundant with basic.lval/5 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) basic_lval_5(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(ReturnIntReference()); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LVALUE(ReturnEnumReference()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace Namespace 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int x; 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void function(); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void expr_prim_8() 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.prim/8 A nested-name-specifier that names a namespace 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (7.3), followed by the name of a member of that namespace (or 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the name of a member of a namespace made visible by a 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // using-directive ) is a qualified-id; 3.4.3.2 describes name 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lookup for namespace members that appear in qualified-ids. The 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result is the member. The type of the result is the type of the 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // member. The result is an lvalue if the member is a function or 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a variable. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(Namespace::x); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(Namespace::function); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_sub_1(int* pointer) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.sub/1 A postfix expression followed by an expression in 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // square brackets is a postfix expression. One of the expressions 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shall have the type "pointer to T" and the other shall have 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enumeration or integral type. The result is an lvalue of type 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "T." 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LVALUE(pointer[1]); 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The expression E1[E2] is identical (by definition) to *((E1)+(E2)). 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(*(pointer+1)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_type_conv_1() 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.type.conv/1 A simple-type-specifier (7.1.5) followed by a 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // parenthesized expression-list constructs a value of the specified 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type given the expression list. ... If the expression list 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specifies more than a single value, the type shall be a class with 32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // a suitably declared constructor (8.5, 12.1), and the expression 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // T(x1, x2, ...) is equivalent in effect to the declaration T t(x1, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // x2, ...); for some invented temporary variable t, with the result 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being the value of t as an rvalue. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(Class(2,2)); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_type_conv_2() 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.type.conv/2 The expression T(), where T is a 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // simple-type-specifier (7.1.5.2) for a non-array complete object 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type or the (possibly cv-qualified) void type, creates an 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rvalue of the specified type, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(int()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(Class()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(void()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_ref_4() 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Applies to expressions of the form E1.E2 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If E2 is declared to have type "reference to T", then E1.E2 is 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an lvalue;.... Otherwise, one of the following rules applies. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(Class().staticReferenceDataMember); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(Class().referenceDataMember); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - If E2 is a static data member, and the type of E2 is T, then 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // E1.E2 is an lvalue; ... 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LVALUE(Class().staticNonreferenceDataMember); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_LVALUE(Class().staticReferenceDataMember); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - If E2 is a non-static data member, ... If E1 is an lvalue, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then E1.E2 is an lvalue... 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Class lvalue; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(lvalue.dataMember); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(Class().dataMember); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - If E1.E2 refers to a static member function, ... then E1.E2 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is an lvalue 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(Class().StaticMemberFunction); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Otherwise, if E1.E2 refers to a non-static member function, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then E1.E2 is not an lvalue. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //ASSERT_RVALUE(Class().NonstaticMemberFunction); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - If E2 is a member enumerator, and the type of E2 is T, the 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expression E1.E2 is not an lvalue. The type of E1.E2 is T. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(Class().Enumerator); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(lvalue.Enumerator); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_post_incr_1(int x) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.post.incr/1 The value obtained by applying a postfix ++ is 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the value that the operand had before applying the 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operator... The result is an rvalue. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(x++); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void expr_dynamic_cast_2() 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // expr.dynamic.cast/2: If T is a pointer type, v shall be an 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rvalue of a pointer to complete class type, and the result is 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an rvalue of type T. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Class instance; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(dynamic_cast<Class*>(&instance)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If T is a reference type, v shall be an 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lvalue of a complete class type, and the result is an lvalue of 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the type referred to by T. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(dynamic_cast<Class&>(instance)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_dynamic_cast_5() 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.dynamic.cast/5: If T is "reference to cv1 B" and v has type 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "cv2 D" such that B is a base class of D, the result is an 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lvalue for the unique B sub-object of the D object referred 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to by v. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef BaseClass B; 4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef Class D; 4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) D object; 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_LVALUE(dynamic_cast<B&>(object)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// expr.dynamic.cast/8: The run-time check logically executes as follows: 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// - If, in the most derived object pointed (referred) to by v, v 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// points (refers) to a public base class subobject of a T object, and 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if only one object of type T is derived from the sub-object pointed 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (referred) to by v, the result is a pointer (an lvalue referring) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to that T object. 4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// - Otherwise, if v points (refers) to a public base class sub-object 4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// of the most derived object, and the type of the most derived object 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has a base class, of type T, that is unambiguous and public, the 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// result is a pointer (an lvalue referring) to the T sub-object of 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the most derived object. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The mention of "lvalue" in the text above appears to be a 4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// defect that is being corrected by the response to UK65 (see 4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2841.html). 4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if 0 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_typeid_1() 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.typeid/1: The result of a typeid expression is an lvalue... 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(typeid(1)); 44068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_static_cast_1(int x) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.static.cast/1: The result of the expression 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // static_cast<T>(v) is the result of converting the expression v 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to type T. If T is a reference type, the result is an lvalue; 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // otherwise, the result is an rvalue. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(static_cast<int&>(x)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(static_cast<int>(x)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid expr_reinterpret_cast_1() 454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch{ 455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // expr.reinterpret.cast/1: The result of the expression 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reinterpret_cast<T>(v) is the result of converting the 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expression v to type T. If T is a reference type, the result is 458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // an lvalue; otherwise, the result is an rvalue 459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_RVALUE(reinterpret_cast<int*>(0)); 460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch char const v = 0; 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_LVALUE(reinterpret_cast<char const&>(v)); 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid expr_unary_op_1(int* pointer, struct incomplete* pointerToIncompleteType) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // expr.unary.op/1: The unary * operator performs indirection: the 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // expression to which it is applied shall be a pointer to an 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // object type, or a pointer to a function type and the result is 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // an lvalue referring to the object or function to which the 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expression points. 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_LVALUE(*pointer); 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_LVALUE(*Function); 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // [Note: a pointer to an incomplete type 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (other than cv void ) can be dereferenced. ] 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_LVALUE(*pointerToIncompleteType); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void expr_pre_incr_1(int operand) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.pre.incr/1: The operand of prefix ++ ... shall be a 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // modifiable lvalue.... The value is the new value of the 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operand; it is an lvalue. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(++operand); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_cast_1(int x) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.cast/1: The result of the expression (T) cast-expression 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is of type T. The result is an lvalue if T is a reference type, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise the result is an rvalue. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE((void(&)())expr_cast_1); 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_LVALUE((int&)x); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE((void(*)())expr_cast_1); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE((int)x); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_mptr_oper() 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.mptr.oper/6: The result of a .* expression is an lvalue 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only if its first operand is an lvalue and its second operand 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is a pointer to data member... (cont'd) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Class MakeRValue; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(MakeRValue().*(&Class::dataMember)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //ASSERT_RVALUE(MakeRValue().*(&Class::NonstaticMemberFunction)); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Class lvalue; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(lvalue.*(&Class::dataMember)); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //ASSERT_RVALUE(lvalue.*(&Class::NonstaticMemberFunction)); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (cont'd)...The result of an ->* expression is an lvalue only 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if its second operand is a pointer to data member. If the 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // second operand is the null pointer to member value (4.11), the 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // behavior is undefined. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE((&lvalue)->*(&Class::dataMember)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //ASSERT_RVALUE((&lvalue)->*(&Class::NonstaticMemberFunction)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void expr_cond(bool cond) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5.16 Conditional operator [expr.cond] 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 If either the second or the third operand has type (possibly 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cv-qualified) void, then the lvalue-to-rvalue (4.1), 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // array-to-pointer (4.2), and function-to-pointer (4.3) standard 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // conversions are performed on the second and third operands, and one 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the following shall hold: 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - The second or the third operand (but not both) is a 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // throw-expression (15.1); the result is of the type of the other and 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is an rvalue. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Class classLvalue; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? throw 1 : (void)0); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? (void)0 : throw 1); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? throw 1 : classLvalue); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? classLvalue : throw 1); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - Both the second and the third operands have type void; the result 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is of type void and is an rvalue. [Note: this includes the case 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // where both operands are throw-expressions. ] 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? (void)1 : (void)0); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? throw 1 : throw 0); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.cond/4: If the second and third operands are lvalues and 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have the same type, the result is of that type and is an 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lvalue. 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(cond ? classLvalue : classLvalue); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int intLvalue = 0; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LVALUE(cond ? intLvalue : intLvalue); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expr.cond/5:Otherwise, the result is an rvalue. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Class MakeRValue; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? MakeRValue() : classLvalue); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? classLvalue : MakeRValue()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? MakeRValue() : MakeRValue()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_RVALUE(cond ? classLvalue : intLvalue); 55703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_RVALUE(cond ? intLvalue : int()); 55803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 56003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void expr_ass_1(int x) 56103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles){ 56203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // expr.ass/1: There are several assignment operators, all of 56303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // which group right-to-left. All require a modifiable lvalue as 56403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // their left operand, and the type of an assignment expression is 56503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // that of its left operand. The result of the assignment 56603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // operation is the value stored in the left operand after the 56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // assignment has taken place; the result is an lvalue. 5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x = 1); 5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x += 1); 5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x -= 1); 5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x *= 1); 5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x /= 1); 5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x %= 1); 5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x ^= 1); 5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x &= 1); 5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(x |= 1); 5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void expr_comma(int x) 5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){ 5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // expr.comma: A pair of expressions separated by a comma is 5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // evaluated left-to-right and the value of the left expression is 5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // discarded... result is an lvalue if its right operand is. 5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Can't use the ASSERT_XXXX macros without adding parens around 5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // the comma expression. 5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_assert(__is_lvalue_expr(x,x), "expected an lvalue"); 5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_assert(__is_rvalue_expr(x,1), "expected an rvalue"); 5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_assert(__is_lvalue_expr(1,x), "expected an lvalue"); 5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static_assert(__is_rvalue_expr(1,1), "expected an rvalue"); 5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if 0 59468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template<typename T> void f(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// FIXME These currently fail 5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void expr_fun_lvalue() 5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){ 5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(&f<int>); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void expr_fun_rvalue() 6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){ 6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_RVALUE(f<int>); 6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)template <int NonTypeNonReferenceParameter, int& NonTypeReferenceParameter> 6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void check_temp_param_6() 6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){ 6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_RVALUE(NonTypeNonReferenceParameter); 6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_LVALUE(NonTypeReferenceParameter); 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 61403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 61503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)int AnInt = 0; 61603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void temp_param_6() 61803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles){ 61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) check_temp_param_6<3,AnInt>(); 62003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 62103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)