re PR c++/87861 (ICE in output_constructor_regular_field, at varasm.c:5165)
authorJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Dec 2018 20:37:53 +0000 (21:37 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Dec 2018 20:37:53 +0000 (21:37 +0100)
PR c++/87861
* class.c (build_vtbl_initializer): For TARGET_VTABLE_USES_DESCRIPTORS
bump index for each added word.
* constexpr.c (find_array_ctor_elt): Add forward declaration.
(cxx_eval_call_expression): Handle TARGET_VTABLE_USES_DESCRIPTORS
vtable calls.
(cxx_eval_constant_expression) <case OBJ_TYPE_REF>: Divide token
by TARGET_VTABLE_USES_DESCRIPTORS if non-zero.

From-SVN: r267032

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/constexpr.c

index 3e49922158213a6cb06937e439bc221e6498b548..db057d093f85cc59e23936e6f9c1ddad66f65821 100644 (file)
@@ -1,3 +1,14 @@
+2018-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/87861
+       * class.c (build_vtbl_initializer): For TARGET_VTABLE_USES_DESCRIPTORS
+       bump index for each added word.
+       * constexpr.c (find_array_ctor_elt): Add forward declaration.
+       (cxx_eval_call_expression): Handle TARGET_VTABLE_USES_DESCRIPTORS
+       vtable calls.
+       (cxx_eval_constant_expression) <case OBJ_TYPE_REF>: Divide token
+       by TARGET_VTABLE_USES_DESCRIPTORS if non-zero.
+
 2018-12-11  Marek Polacek  <polacek@redhat.com>
 
        PR c++/86608 - reading constexpr volatile variable.
        * decl2.c (grokbitfield): Use DECL_SOURCE_LOCATION in error message;
        print the type too; fix thinko in INDIRECT_TYPE_P use.
 
-2018-12-05  Alexandre Oliva <aoliva@redhat.com>
+2018-12-05  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/85569
        * constexpr.c (adjust_temp_type): Test for type equality with
        if it is true.
        (cp_parser_omp_clause_name): Handle nontemporal, in_reduction and
        task_reduction clauses.
-        (cp_parser_omp_var_list_no_open): Handle
+       (cp_parser_omp_var_list_no_open): Handle
        OMP_CLAUSE_{IN,TASK}_REDUCTION.  For OMP_CLAUSE_DEPEND, parse clause
        operands as either an array section, or lvalue assignment expression.
        (cp_parser_omp_clause_if): Handle cancel and simd modifiers.
        PR ipa/81277
        * cp-tree.h (DECL_FNAME_P): New macro.
        * decl.c (cp_make_fname_decl): Set DECL_DECLARED_CONSTEXPR_P,
-        DECL_VALUE_EXPR, DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P.
+       DECL_VALUE_EXPR, DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P.
        (cp_finish_decl):
        * lambda.c (is_capture_proxy): Use DECL_FNAME_P.
        * pt.c (tsubst_expr): Handle DECL_PRETTY_FUNCTION_P.
 2018-10-29  Joseph Myers  <joseph@codesourcery.com>
            Julian Brown  <julian@codesourcery.com>
 
-        PR c++/66053
-        * semantics.c (handle_omp_array_sections_1): Allow array
-        sections with "this" pointer for OpenACC.
+       PR c++/66053
+       * semantics.c (handle_omp_array_sections_1): Allow array
+       sections with "this" pointer for OpenACC.
 
 2018-10-25  Jason Merrill  <jason@redhat.com>
 
        * name-lookup.c (check_local_shadow): Do not test DECL_FROM_INLINE.
 
 2018-09-28  Eric Botcazou  <ebotcazou@adacore.com>
-            Pierre-Marie de Rodat  <derodat@adacore.com>
+           Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * method.c (use_thunk): Adjust call to cgraph_node::create_thunk.
 
        case into complain_about_bad_argument.
 
 2018-09-09  Cesar Philippidis  <cesar@codesourcery.com>
-            Julian Brown  <julian@codesourcery.com>
+           Julian Brown  <julian@codesourcery.com>
 
        PR middle-end/86336
        * semantics.c (finish_omp_clauses): Treat C++ references the same in
        information in a few additional error messages.
        (grokdeclarator): Update calls.
 
-2018-06-20  Chung-Lin Tang <cltang@codesourcery.com>
-           Thomas Schwinge <thomas@codesourcery.com>
+2018-06-20  Chung-Lin Tang  <cltang@codesourcery.com>
+           Thomas Schwinge  <thomas@codesourcery.com>
            Cesar Philippidis  <cesar@codesourcery.com>
 
        * parser.c (cp_parser_omp_clause_name): Add support for finalize
        * cp-gimplify.c (cp_fold) <case ADDR_EXPR>: ... here.  Only use it
        if INDIRECT_REF's operand is INTEGER_CST cast to pointer type.
 
-2018-04-18  Alexandre Oliva <aoliva@redhat.com>
+2018-04-18  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/80290
        * cp-tree.h (struct tinst_level): Split decl into tldcl and
        for refcount.  Release pending_template to freelist.
        (instantiating_current_function_p): Use new accessors.
 
-2018-04-16  Alexandre Oliva <aoliva@redhat.com>
+2018-04-16  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/85039
        * parser.c (cp_parser_builtin_offset): Reject type definitions.
        * pt.c (extract_locals_r): Don't record the local specs of variables
        declared within the pattern.
 
-2018-04-05  Alexandre Oliva <aoliva@redhat.com>
+2018-04-05  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/84979
        * pt.c (check_auto_in_tmpl_args): New.
        * decl.c (grokfndecl): Handle standard UDL diagnostics here..
        * parser.c (cp_parser_unqualified_id): ..not here.
 
-2018-04-04  Alexandre Oliva <aoliva@redhat.com>
+2018-04-04  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/84943
        * typeck.c (cp_build_addr_expr_1): Mark FUNCTION_DECL as
        into packs here.
        (cp_parser_parameter_declaration_list): Not here.
 
-2018-03-31  Alexandre Oliva <aoliva@redhat.com>
+2018-03-31  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/85027
        * class.c (instantiate_type): Peel off SAVE_EXPR before
        * pt.c (tsubst_default_argument): Early return if the type of the
        parameter is erroneous.
 
-2018-03-28  Alexandre Oliva <aoliva@redhat.com>
+2018-03-28  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/84973
        * decl2.c (note_vague_linkage_fn): Don't defer uninstantiated
        PR c++/85033
        * semantics.c (finish_offsetof): Don't allow CONST_DECLs.
 
-2018-03-23  Alexandre Oliva <aoliva@redhat.com>
+2018-03-23  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/71251
        * parser.c (cp_parser_alias_declaration): Call
        (build_special_member_call): Only do C++17 copy elision here if the
        argument is already the right type.
 
-2018-03-21  Alexandre Oliva <aoliva@redhat.com>
+2018-03-21  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/71965
        * init.c (build_vec_init): Silence error, former sorry,
        * constexpr.c (cxx_bind_parameters_in_call): Unshare evaluated
        arguments.
 
-2018-03-06  Alexandre Oliva <aoliva@redhat.com>
+2018-03-06  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/84231
        * tree.c (lvalue_kind): Use presence/absence of REFERENCE_TYPE
        require_potential_rvalue_constant_expression.
 
 2018-03-01  Jason Merrill  <jason@redhat.com>
-           Alexandre Oliva <aoliva@redhat.com>
+           Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/71569 - ICE with redundant args on member variable template.
        * decl.c (start_decl): Handle partial specialization of member
index 1bcb146fbb64129661f0c8ca75a940f355e8bc74..fec1c5dd7d050e3cf6fa1271d342d9414588cede 100644 (file)
@@ -9351,7 +9351,6 @@ build_vtbl_initializer (tree binfo,
       tree vcall_index;
       tree fn, fn_original;
       tree init = NULL_TREE;
-      tree idx = size_int (jx++);
 
       fn = BV_FN (v);
       fn_original = fn;
@@ -9455,7 +9454,7 @@ build_vtbl_initializer (tree binfo,
          int i;
          if (init == size_zero_node)
            for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i)
-             CONSTRUCTOR_APPEND_ELT (*inits, idx, init);
+             CONSTRUCTOR_APPEND_ELT (*inits, size_int (jx++), init);
          else
            for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i)
              {
@@ -9463,11 +9462,11 @@ build_vtbl_initializer (tree binfo,
                                     fn, build_int_cst (NULL_TREE, i));
                TREE_CONSTANT (fdesc) = 1;
 
-               CONSTRUCTOR_APPEND_ELT (*inits, idx, fdesc);
+               CONSTRUCTOR_APPEND_ELT (*inits, size_int (jx++), fdesc);
              }
        }
       else
-       CONSTRUCTOR_APPEND_ELT (*inits, idx, init);
+       CONSTRUCTOR_APPEND_ELT (*inits, size_int (jx++), init);
     }
 }
 
index 44db38029bf6b264929ce4ac9360cfb9e6378f98..96326c3a6988afc1c70d5b91f60e348d2e719945 100644 (file)
@@ -41,6 +41,9 @@ do {                                                                  \
     return t;                                                          \
  } while (0)
 
+static HOST_WIDE_INT find_array_ctor_elt (tree ary, tree dindex,
+                                         bool insert = false);
+
 /* Returns true iff FUN is an instantiation of a constexpr function
    template or a defaulted constexpr function.  */
 
@@ -1516,6 +1519,36 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
       STRIP_NOPS (fun);
       if (TREE_CODE (fun) == ADDR_EXPR)
        fun = TREE_OPERAND (fun, 0);
+      /* For TARGET_VTABLE_USES_DESCRIPTORS targets, there is no
+        indirection, the called expression is a pointer into the
+        virtual table which should contain FDESC_EXPR.  Extract the
+        FUNCTION_DECL from there.  */
+      else if (TARGET_VTABLE_USES_DESCRIPTORS
+              && TREE_CODE (fun) == POINTER_PLUS_EXPR
+              && TREE_CODE (TREE_OPERAND (fun, 0)) == ADDR_EXPR
+              && TREE_CODE (TREE_OPERAND (fun, 1)) == INTEGER_CST)
+       {
+         tree d = TREE_OPERAND (TREE_OPERAND (fun, 0), 0);
+         if (VAR_P (d)
+             && DECL_VTABLE_OR_VTT_P (d)
+             && TREE_CODE (TREE_TYPE (d)) == ARRAY_TYPE
+             && TREE_TYPE (TREE_TYPE (d)) == vtable_entry_type
+             && DECL_INITIAL (d)
+             && TREE_CODE (DECL_INITIAL (d)) == CONSTRUCTOR)
+           {
+             tree i = int_const_binop (TRUNC_DIV_EXPR, TREE_OPERAND (fun, 1),
+                                       TYPE_SIZE_UNIT (vtable_entry_type));
+             HOST_WIDE_INT idx = find_array_ctor_elt (DECL_INITIAL (d), i);
+             if (idx >= 0)
+               {
+                 tree fdesc
+                   = (*CONSTRUCTOR_ELTS (DECL_INITIAL (d)))[idx].value;
+                 if (TREE_CODE (fdesc) == FDESC_EXPR
+                     && integer_zerop (TREE_OPERAND (fdesc, 1)))
+                   fun = TREE_OPERAND (fdesc, 0);
+               }
+           }
+       }
     }
   if (TREE_CODE (fun) != FUNCTION_DECL)
     {
@@ -2240,7 +2273,7 @@ array_index_cmp (tree key, tree index)
    if none.  If INSERT is true, insert a matching element rather than fail.  */
 
 static HOST_WIDE_INT
-find_array_ctor_elt (tree ary, tree dindex, bool insert = false)
+find_array_ctor_elt (tree ary, tree dindex, bool insert)
 {
   if (tree_int_cst_sgn (dindex) < 0)
     return -1;
@@ -4834,6 +4867,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
        /* Find the function decl in the virtual functions list.  TOKEN is
           the DECL_VINDEX that says which function we're looking for.  */
        tree virtuals = BINFO_VIRTUALS (TYPE_BINFO (objtype));
+       if (TARGET_VTABLE_USES_DESCRIPTORS)
+         token /= MAX (TARGET_VTABLE_USES_DESCRIPTORS, 1);
        r = TREE_VALUE (chain_index (token, virtuals));
        break;
       }