Commit c154b3d8 by Nicola Pero Committed by Nicola Pero

In gcc/testsuite/: 2010-10-07 Nicola Pero <nicola.pero@meta-innovation.com>

In gcc/testsuite/:
2010-10-07  Nicola Pero  <nicola.pero@meta-innovation.com>

        * obj-c++.dg/encode-10.mm: New testcase.

In gcc/cp/:
2010-10-07  Nicola Pero  <nicola.pero@meta-innovation.com>

        * cp-tree.def: Changed type of AT_ENCODE_EXPR from tcc_unary to
        tcc_expression.
        * cxx-pretty-print.c (pp_cxx_unary_expression): Added case for
        AT_ENCODE_EXPR.
        * error.c (dump_expr): Added case for AT_ENCODE_EXPR.
        * pt.c (tsubst_copy): Added case for AT_ENCODE_EXPR.
        (value_dependent_expression_p): Added case for AT_ENCODE_EXPR.
        (type_dependent_expression_p): Added case for AT_ENCODE_EXPR.
        * parser.c (cp_parser_objc_encode_expression): Updated comment.

From-SVN: r165138
parent 2fb996b6
2010-10-07 Nicola Pero <nicola.pero@meta-innovation.com>
* cp-tree.def: Changed type of AT_ENCODE_EXPR from tcc_unary to
tcc_expression.
* cxx-pretty-print.c (pp_cxx_unary_expression): Added case for
AT_ENCODE_EXPR.
* error.c (dump_expr): Added case for AT_ENCODE_EXPR.
* pt.c (tsubst_copy): Added case for AT_ENCODE_EXPR.
(value_dependent_expression_p): Added case for AT_ENCODE_EXPR.
(type_dependent_expression_p): Added case for AT_ENCODE_EXPR.
* parser.c (cp_parser_objc_encode_expression): Updated comment.
2010-10-07 Nicola Pero <nicola@nicola.brainstorm.co.uk>
Merge from apple/trunk branch on FSF servers.
......
......@@ -337,7 +337,7 @@ DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_expression, 1)
/* Represents an Objective-C++ '@encode' expression during template
expansion. */
DEFTREECODE (AT_ENCODE_EXPR, "at_encode_expr", tcc_unary, 1)
DEFTREECODE (AT_ENCODE_EXPR, "at_encode_expr", tcc_expression, 1)
/* A STMT_EXPR represents a statement-expression during template
expansion. This is the GCC extension { ( ... ) }. The
......
......@@ -791,6 +791,14 @@ pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
pp_unary_expression (pp, TREE_OPERAND (t, 0));
break;
case AT_ENCODE_EXPR:
pp_cxx_ws_string (pp, "@encode");
pp_cxx_whitespace (pp);
pp_cxx_left_paren (pp);
pp_cxx_type_id (pp, TREE_OPERAND (t, 0));
pp_cxx_right_paren (pp);
break;
case NOEXCEPT_EXPR:
pp_cxx_ws_string (pp, "noexcept");
pp_cxx_whitespace (pp);
......
......@@ -2141,6 +2141,14 @@ dump_expr (tree t, int flags)
pp_cxx_right_paren (cxx_pp);
break;
case AT_ENCODE_EXPR:
pp_cxx_ws_string (cxx_pp, "@encode");
pp_cxx_whitespace (cxx_pp);
pp_cxx_left_paren (cxx_pp);
dump_type (TREE_OPERAND (t, 0), flags);
pp_cxx_right_paren (cxx_pp);
break;
case NOEXCEPT_EXPR:
pp_cxx_ws_string (cxx_pp, "noexcept");
pp_cxx_whitespace (cxx_pp);
......
......@@ -21128,6 +21128,12 @@ cp_parser_objc_encode_expression (cp_parser* parser)
return error_mark_node;
}
/* This happens if we find @encode(T) (where T is a template
typename or something dependent on a template typename) when
parsing a template. In that case, we can't compile it
immediately, but we rather create an AT_ENCODE_EXPR which will
need to be instantiated when the template is used.
*/
if (dependent_type_p (type))
{
tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
......
......@@ -11131,6 +11131,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case ADDR_EXPR:
case UNARY_PLUS_EXPR: /* Unary + */
case ALIGNOF_EXPR:
case AT_ENCODE_EXPR:
case ARROW_EXPR:
case THROW_EXPR:
case TYPEID_EXPR:
......@@ -17689,6 +17690,12 @@ value_dependent_expression_p (tree expression)
return dependent_type_p (expression);
return type_dependent_expression_p (expression);
case AT_ENCODE_EXPR:
/* An 'encode' expression is value-dependent if the operand is
type-dependent. */
expression = TREE_OPERAND (expression, 0);
return dependent_type_p (expression);
case NOEXCEPT_EXPR:
expression = TREE_OPERAND (expression, 0);
/* FIXME why check value-dependency? */
......@@ -17806,6 +17813,7 @@ type_dependent_expression_p (tree expression)
if (TREE_CODE (expression) == PSEUDO_DTOR_EXPR
|| TREE_CODE (expression) == SIZEOF_EXPR
|| TREE_CODE (expression) == ALIGNOF_EXPR
|| TREE_CODE (expression) == AT_ENCODE_EXPR
|| TREE_CODE (expression) == NOEXCEPT_EXPR
|| TREE_CODE (expression) == TRAIT_EXPR
|| TREE_CODE (expression) == TYPEID_EXPR
......
2010-10-07 Nicola Pero <nicola.pero@meta-innovation.com>
* obj-c++.dg/encode-10.mm: New testcase.
2010-10-07 Nicola Pero <nicola.pero@meta-innovation.com>
PR objc++/23614
* obj-c++.dg/lookup-2.mm: Do not assign 'nil' to a pointer to a
C++ class. Removed XFAIL.
......
/* Test for @encode in templates. */
/* { dg-options "-lobjc" } */
/* { dg-do run } */
#include <string.h>
#include <stdlib.h>
template<typename T>
const char *my_encode(int variant)
{
const char *result;
switch (variant)
{
case 0:
result = @encode(T);
break;
case 1:
result = @encode(T*);
break;
case 2:
result = @encode(const T*);
break;
default:
result = @encode(int);
break;
}
return result;
}
int main()
{
if (strcmp (@encode(char), my_encode<char>(0)))
abort ();
if (strcmp (@encode(char *), my_encode<char>(1)))
abort ();
if (strcmp (@encode(const char *), my_encode<char>(2)))
abort ();
if (strcmp (@encode(int), my_encode<char>(3)))
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment