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)