In gcc/testsuite/: 2010-10-07 Nicola Pero <nicola.pero@meta-innovation.com>
authorNicola Pero <nicola.pero@meta-innovation.com>
Thu, 7 Oct 2010 22:34:50 +0000 (22:34 +0000)
committerNicola Pero <nicola@gcc.gnu.org>
Thu, 7 Oct 2010 22:34:50 +0000 (22:34 +0000)
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

gcc/cp/ChangeLog
gcc/cp/cp-tree.def
gcc/cp/cxx-pretty-print.c
gcc/cp/error.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/encode-10.mm [new file with mode: 0644]

index 7e6bdda9f4281bb0414e3313405ffa60d0953676..b243c5a46892b2dcdbb94bbbba5a75753a4bf8f1 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 1065c80f6cffd36c60d0d1f879dfeaa9044ef38f..3f14a837dbd686996d3cf65342e1ce9ac26d44fa 100644 (file)
@@ -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
index c3701c244329d80aa8926d83c12337dce8724362..bbef2272457e0c28b6c3f8f6247271cd12ead032 100644 (file)
@@ -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);
index be3dd2c9ad18b932eb270790630cabbd4c3c32cf..185b361cf007fa5448ca4148ffc0aa44629b8c93 100644 (file)
@@ -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);
index f5fa793da4a9877b2d9a02d4d770bddd394dfe3b..f5f4521a2d047af5e90b7659810d0983d5299a8e 100644 (file)
@@ -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);
index 506bf9ad3879a9d3b5a14af0ba622541cef32079..9afa74d1679b4bbe6d2b0a408a266e3b5a76f1fb 100644 (file)
@@ -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
index 325ef7640fd73f93b8b9ca3c451c461b15800819..13fbb7e1c37e6d0301a46328800c1cbbb6f05781 100644 (file)
@@ -1,3 +1,7 @@
+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
diff --git a/gcc/testsuite/obj-c++.dg/encode-10.mm b/gcc/testsuite/obj-c++.dg/encode-10.mm
new file mode 100644 (file)
index 0000000..2b3af88
--- /dev/null
@@ -0,0 +1,46 @@
+/* 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;
+}