tree.h (DECL_UNINLINABLE): Move from C++ frontend.
authorJason Merrill <jason@redhat.com>
Wed, 21 Feb 2001 14:42:27 +0000 (09:42 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 21 Feb 2001 14:42:27 +0000 (09:42 -0500)
        * tree.h (DECL_UNINLINABLE): Move from C++ frontend.
        (struct tree_decl): Add uninlinable bitfield.
        * c-decl.c (duplicate_decls): Set it.
        * integrate.c (function_cannot_inline_p): Check it.
        * cp-tree.h (struct lang_decl_flags): Remove uninlinable flag.
        (DECL_UNINLINABLE): Move to middle-end.

        * dwarf2out.c (add_name_and_src_coords_attributes): Don't add
        DW_AT_MIPS_linkage_name to abstract methods.
        (dwarf2out_abstract_function): Emit class context before calling
        set_decl_abstract_flags.  Don't clear DECL_ABSTRACT.
        (gen_subprogram_die): Remove obsolete code.
        (gen_member_die): Don't include clones in the member list.
        (gen_decl_die): Emit abstract info for clone origin.
        * dwarfout.c (output_type): Don't include clones in the member list.
        * dbxout.c (dbxout_type_methods): Ignore abstract methods.
        * toplev.c (note_deferral_of_defined_inline_function): Don't clear
        DECL_ABSTRACT on a function that already has it set.
        * class.c (clone_function_decl): Set DECL_ABSTRACT on original fn.
        * decl.c (duplicate_decls): Preserve DECL_ABSTRACT.
        * class.c (build_clone): Set DECL_ABSTRACT_ORIGIN for the clone.
        * optimize.c (maybe_clone_body): Set DECL_ABSTRACT_ORIGIN for the
        parms and outer BLOCK.  note_deferral_of_defined_inline_function.

        * dwarf2out.c (gen_formal_types_die): Also accept a FUNCTION_DECL.
        (get_subprogram_die): Pass it in.
        * method.c (implicitly_declare_fn): Don't set DECL_ARTIFICIAL on
        second parm of op=.

From-SVN: r39945

14 files changed:
gcc/ChangeLog
gcc/c-decl.c
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/method.c
gcc/cp/optimize.c
gcc/dbxout.c
gcc/dwarf2out.c
gcc/dwarfout.c
gcc/integrate.c
gcc/toplev.c
gcc/tree.h

index f0ffdcc67543d46b846a6e7e9d4df3927287c158..57d50323ca3c00f5f1fa36eeb5e09ba952a8efbd 100644 (file)
@@ -1,3 +1,25 @@
+2001-02-21  Jason Merrill  <jason@redhat.com>
+
+       * tree.h (DECL_UNINLINABLE): Move from C++ frontend.
+       (struct tree_decl): Add uninlinable bitfield.
+       * c-decl.c (duplicate_decls): Set it.
+       * integrate.c (function_cannot_inline_p): Check it.
+
+       * dwarf2out.c (add_name_and_src_coords_attributes): Don't add 
+       DW_AT_MIPS_linkage_name to abstract methods.
+       (dwarf2out_abstract_function): Emit class context before calling
+       set_decl_abstract_flags.  Don't clear DECL_ABSTRACT.
+       (gen_subprogram_die): Remove obsolete code.
+       (gen_member_die): Don't include clones in the member list.
+       (gen_decl_die): Emit abstract info for clone origin.
+       * dwarfout.c (output_type): Don't include clones in the member list.
+       * dbxout.c (dbxout_type_methods): Ignore abstract methods.
+       * toplev.c (note_deferral_of_defined_inline_function): Don't clear
+       DECL_ABSTRACT on a function that already has it set.
+
+       * dwarf2out.c (gen_formal_types_die): Also accept a FUNCTION_DECL.
+       (get_subprogram_die): Pass it in.
+
 2001-02-21  Richard Earnshaw  <rearnsha@arm.com>
 
        * flow.c (mark_set_1): Make not_dead unsigned long.  For
index a2118fdfdc1a27ce077ac6070fd0fb08866b3258..0f104a44cf0de5eaf8979dfb269f8dcd4e9bf91a 100644 (file)
@@ -1928,19 +1928,6 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
   /* For functions, static overrides non-static.  */
   if (TREE_CODE (newdecl) == FUNCTION_DECL)
     {
-      /* If we're redefining a function previously defined as extern
-        inline, make sure we emit debug info for the inline before we
-        throw it away, in case it was inlined into a function that hasn't
-        been written out yet.  */
-      if (new_is_definition && DECL_INITIAL (olddecl) && TREE_USED (olddecl))
-       {
-         note_outlining_of_inline_function (olddecl);
-
-         /* The new defn must not be inline.
-            FIXME what about -finline-functions? */
-         DECL_INLINE (newdecl) = 0;
-       }
-
       TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
       /* This is since we don't automatically
         copy the attributes of NEWDECL into OLDDECL.  */
@@ -1974,12 +1961,27 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
 
   if (TREE_CODE (newdecl) == FUNCTION_DECL)
     {
-      /* If either decl says `inline', this fn is inline,
-        unless its definition was passed already.  */
-      if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0)
-       DECL_INLINE (olddecl) = 1;
+      /* If we're redefining a function previously defined as extern
+        inline, make sure we emit debug info for the inline before we
+        throw it away, in case it was inlined into a function that hasn't
+        been written out yet.  */
+      if (new_is_definition && DECL_INITIAL (olddecl) && TREE_USED (olddecl))
+       {
+         note_outlining_of_inline_function (olddecl);
 
-      DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
+         /* The new defn must not be inline.  */
+         DECL_INLINE (newdecl) = 0;
+         DECL_UNINLINABLE (newdecl) = 1;
+       }
+      else
+       {
+         /* If either decl says `inline', this fn is inline,
+            unless its definition was passed already.  */
+         if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0)
+           DECL_INLINE (olddecl) = 1;
+
+         DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
+       }
 
       if (DECL_BUILT_IN (olddecl))
        {
index 5387d68d43797485d717673382d42563008bea15..9c0ad71cae24122797792a9082f1fb092c01c8c1 100644 (file)
@@ -1,3 +1,17 @@
+2001-02-21  Jason Merrill  <jason@redhat.com>
+
+       * cp-tree.h (struct lang_decl_flags): Remove uninlinable flag.
+       (DECL_UNINLINABLE): Move to middle-end.
+
+       * class.c (clone_function_decl): Set DECL_ABSTRACT on original fn.
+       * decl.c (duplicate_decls): Preserve DECL_ABSTRACT.
+       * class.c (build_clone): Set DECL_ABSTRACT_ORIGIN for the clone.
+       * optimize.c (maybe_clone_body): Set DECL_ABSTRACT_ORIGIN for the
+       parms and outer BLOCK.  note_deferral_of_defined_inline_function.
+
+       * method.c (implicitly_declare_fn): Don't set DECL_ARTIFICIAL on
+       second parm of op=.
+
 2001-02-19  Mark Mitchell  <mark@codesourcery.com>
 
        * decl2.c (set_decl_namespace): Allow explicit instantiations in
index 6752c90db9109e3cf17625a88405b4da4c9f6a19..2ba9e037d0a7df70b178f10ac52c23e335dd427d 100644 (file)
@@ -4179,6 +4179,7 @@ build_clone (fn, name)
   clone = copy_decl (fn);
   /* Remember where this function came from.  */
   DECL_CLONED_FUNCTION (clone) = fn;
+  DECL_ABSTRACT_ORIGIN (clone) = fn;
   /* Reset the function name.  */
   DECL_NAME (clone) = name;
   DECL_ASSEMBLER_NAME (clone) = DECL_NAME (clone);
@@ -4339,6 +4340,9 @@ clone_function_decl (fn, update_method_vec_p)
       if (update_method_vec_p)
        add_method (DECL_CONTEXT (clone), clone, /*error_p=*/0);
     }
+
+  /* Note that this is an abstract function that is never emitted.  */
+  DECL_ABSTRACT (fn) = 1;
 }
 
 /* For each of the constructors and destructors in T, create an
index f1e6df51a49a95e5789e2fe7abcfd9f394f90962..240832a9c717ade679d38cfe4dee6c64419a5dcb 100644 (file)
@@ -1811,7 +1811,7 @@ struct lang_decl_flags
   unsigned static_function : 1;
   unsigned pure_virtual : 1;
   unsigned has_in_charge_parm_p : 1;
-  unsigned uninlinable : 1;
+  unsigned has_vtt_parm_p : 1;
 
   unsigned deferred : 1;
   unsigned use_template : 2;
@@ -1828,7 +1828,7 @@ struct lang_decl_flags
   unsigned assignment_operator_p : 1;
   unsigned anticipated_p : 1;
   unsigned generate_with_vtable_p : 1;
-  unsigned has_vtt_parm_p : 1;
+  /* One unused bit.  */
 
   union {
     /* In a FUNCTION_DECL, VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this
@@ -2469,10 +2469,6 @@ extern int flag_new_for_scope;
 /* Record whether a typedef for type `int' was actually `signed int'.  */
 #define C_TYPEDEF_EXPLICITLY_SIGNED(exp) DECL_LANG_FLAG_1 ((exp))
 
-/* In a FUNCTION_DECL, nonzero if the function cannot be inlined.  */
-#define DECL_UNINLINABLE(NODE) \
-  (DECL_LANG_SPECIFIC (NODE)->decl_flags.uninlinable)
-
 /* Returns non-zero if DECL has external linkage, as specified by the
    language standard.  (This predicate may hold even when the
    corresponding entity is not actually given external linkage in the
index af5ac8a4e69d6a5b6ed9770f3766b7b7bdd6bea5..85e9fa6b178f85eef2e2f8b73382df760fc04033 100644 (file)
@@ -3626,6 +3626,9 @@ duplicate_decls (newdecl, olddecl)
        DECL_INLINE (olddecl) = 1;
       DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
 
+      /* Preserve abstractness on cloned [cd]tors.  */
+      DECL_ABSTRACT (newdecl) = DECL_ABSTRACT (olddecl);
+
       if (! types_match)
        {
          DECL_LANGUAGE (olddecl) = DECL_LANGUAGE (newdecl);
index 349afcbb60badd58c7e44c802365bc8f54375650..75e713d3799c913e38e48ee815427f3ccfd85bdc 100644 (file)
@@ -1026,8 +1026,6 @@ implicitly_declare_fn (kind, type, const_p)
 
   my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 20000408);
 
-  if (kind != sfk_constructor && kind != sfk_destructor)
-    DECL_ARTIFICIAL (TREE_CHAIN (DECL_ARGUMENTS (fn))) = 1;
   DECL_ARTIFICIAL (fn) = 1;
   DECL_NOT_REALLY_EXTERN (fn) = 1;
   DECL_THIS_INLINE (fn) = 1;
index 115b4670adb1f38e013a09a8fb90b4d5fbb4eb72..21c94eafee68a31122952ab18fb93862c6a36275 100644 (file)
@@ -932,6 +932,9 @@ maybe_clone_body (fn)
       && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn))
     return 0;
 
+  /* Emit the DWARF1 abstract instance.  */
+  note_deferral_of_defined_inline_function (fn);
+
   /* We know that any clones immediately follow FN in the TYPE_METHODS
      list.  */
   for (clone = TREE_CHAIN (fn);
@@ -996,6 +999,7 @@ maybe_clone_body (fn)
                 from the CLONE to this parameter.  */
              if (DECL_HAS_VTT_PARM_P (clone))
                {
+                 DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
                  splay_tree_insert (id.decl_map,
                                     (splay_tree_key) parm,
                                     (splay_tree_value) clone_parm);
@@ -1013,6 +1017,7 @@ maybe_clone_body (fn)
             function.  */
          else
            {
+             DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
              splay_tree_insert (id.decl_map,
                                 (splay_tree_key) parm,
                                 (splay_tree_value) clone_parm);
@@ -1029,7 +1034,9 @@ maybe_clone_body (fn)
 
       /* Now, expand this function into RTL, if appropriate.  */
       function_name_declared_p = 1;
-      expand_body (finish_function (0));
+      finish_function (0);
+      BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone)) = DECL_INITIAL (fn);
+      expand_body (clone);
       pop_from_top_level ();
     }
   
index 4c4a61a6b6bc5f09f2e9844e156357898ce35ed5..05a95a4b39c924b9d9bb69d6df09a4358e60034f 100644 (file)
@@ -841,7 +841,9 @@ dbxout_type_methods (type)
 
          last = fndecl;
 
-         if (DECL_IGNORED_P (fndecl))
+         /* Also ignore abstract methods; those are only interesting to
+            the DWARF backends.  */
+         if (DECL_IGNORED_P (fndecl) || DECL_ABSTRACT (fndecl))
            continue;
 
          if (flag_minimal_debug)
index ed4970cbf39bf0f96cf2a977fd3eab23a8f3ddc3..ce3efaf0ec0a00fef2de6250891aa8296eb95bda 100644 (file)
@@ -9390,7 +9390,8 @@ add_name_and_src_coords_attributes (die, decl)
 
       if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
          && TREE_PUBLIC (decl)
-         && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
+         && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)
+         && !DECL_ABSTRACT (decl))
        add_AT_string (die, DW_AT_MIPS_linkage_name,
                       IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
     }
@@ -9936,24 +9937,22 @@ gen_formal_types_die (function_or_method_type, context_die)
 {
   register tree link;
   register tree formal_type = NULL;
-  register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
+  register tree first_parm_type;
+  tree arg;
 
-#if 0
-  /* In the case where we are generating a formal types list for a C++
-     non-static member function type, skip over the first thing on the
-     TYPE_ARG_TYPES list because it only represents the type of the hidden
-     `this pointer'.  The debugger should be able to figure out (without
-     being explicitly told) that this non-static member function type takes a
-     `this pointer' and should be able to figure what the type of that hidden
-     parameter is from the DW_AT_member attribute of the parent
-     DW_TAG_subroutine_type DIE.  */
-  if (TREE_CODE (function_or_method_type) == METHOD_TYPE)
-    first_parm_type = TREE_CHAIN (first_parm_type);
-#endif
+  if (TREE_CODE (function_or_method_type) == FUNCTION_DECL)
+    {
+      arg = DECL_ARGUMENTS (function_or_method_type);
+      function_or_method_type = TREE_TYPE (function_or_method_type);
+    }
+  else
+    arg = NULL_TREE;
+  
+  first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
 
   /* Make our first pass over the list of formal parameter types and output a
      DW_TAG_formal_parameter DIE for each one.  */
-  for (link = first_parm_type; link; link = TREE_CHAIN (link))
+  for (link = first_parm_type; link; )
     {
       register dw_die_ref parm_die;
 
@@ -9963,9 +9962,14 @@ gen_formal_types_die (function_or_method_type, context_die)
 
       /* Output a (nameless) DIE to represent the formal parameter itself.  */
       parm_die = gen_formal_parameter_die (formal_type, context_die);
-      if (TREE_CODE (function_or_method_type) == METHOD_TYPE
-         && link == first_parm_type)
+      if ((TREE_CODE (function_or_method_type) == METHOD_TYPE
+          && link == first_parm_type)
+         || (arg && DECL_ARTIFICIAL (arg)))
        add_AT_flag (parm_die, DW_AT_artificial, 1);
+
+      link = TREE_CHAIN (link);
+      if (arg)
+       arg = TREE_CHAIN (arg);
     }
 
   /* If this function type has an ellipsis, add a
@@ -10025,19 +10029,34 @@ void
 dwarf2out_abstract_function (decl)
      tree decl;
 {
-  register dw_die_ref old_die = lookup_decl_die (decl);
+  register dw_die_ref old_die;
   tree save_fn;
+  tree context;
+  int was_abstract = DECL_ABSTRACT (decl);
+
+  /* Make sure we have the actual abstract inline, not a clone.  */
+  decl = DECL_ORIGIN (decl);
 
+  old_die = lookup_decl_die (decl);  
   if (old_die && get_AT_unsigned (old_die, DW_AT_inline))
     /* We've already generated the abstract instance.  */
     return;
 
+  /* Be sure we've emitted the in-class declaration DIE (if any) first, so
+     we don't get confused by DECL_ABSTRACT.  */
+  context = decl_class_context (decl);
+  if (context)
+    gen_type_die_for_member
+      (context, decl, decl_function_context (decl) ? NULL : comp_unit_die);
+  /* Pretend we've just finished compiling this function.  */
   save_fn = current_function_decl;
   current_function_decl = decl;
 
   set_decl_abstract_flags (decl, 1);
   dwarf2out_decl (decl);
-  set_decl_abstract_flags (decl, 0);
+  if (! was_abstract)
+    set_decl_abstract_flags (decl, 0);
 
   current_function_decl = save_fn;
 }
@@ -10088,17 +10107,6 @@ gen_subprogram_die (decl, context_die)
       subr_die = new_die (DW_TAG_subprogram, context_die);
       add_abstract_origin_attribute (subr_die, origin);
     }
-  else if (old_die && DECL_ABSTRACT (decl)
-          && get_AT_unsigned (old_die, DW_AT_inline))
-    {
-      /* This must be a redefinition of an extern inline function.
-        We can just reuse the old die here.  */
-      subr_die = old_die;
-
-      /* Clear out the inlined attribute and parm types.  */
-      remove_AT (subr_die, DW_AT_inline);
-      remove_children (subr_die);
-    }
   else if (old_die)
     {
       register unsigned file_index
@@ -10261,7 +10269,7 @@ gen_subprogram_die (decl, context_die)
   if (debug_info_level <= DINFO_LEVEL_TERSE)
     ;
   else if (declaration)
-    gen_formal_types_die (TREE_TYPE (decl), subr_die);
+    gen_formal_types_die (decl, subr_die);
   else
     {
       /* Generate DIEs to represent all known formal parameters */
@@ -10738,6 +10746,10 @@ gen_member_die (type, context_die)
   /* Now output info about the function members (if any).  */
   for (member = TYPE_METHODS (type); member; member = TREE_CHAIN (member))
     {
+      /* Don't include clones in the member list.  */
+      if (DECL_ABSTRACT_ORIGIN (member))
+       continue;
+
       child = lookup_decl_die (member);
       if (child)
        splice_child_die (context_die, child);
@@ -11266,20 +11278,23 @@ gen_decl_die (decl, context_die)
          && (current_function_decl == NULL_TREE || DECL_ARTIFICIAL (decl)))
        break;
 
+      /* If we're emitting a clone, emit info for the abstract instance.  */
+      if (DECL_ORIGIN (decl) != decl)
+       dwarf2out_abstract_function (DECL_ABSTRACT_ORIGIN (decl));
       /* If we're emitting an out-of-line copy of an inline function,
         emit info for the abstract instance and set up to refer to it.  */
-      if (DECL_INLINE (decl) && ! DECL_ABSTRACT (decl)
-         && ! class_scope_p (context_die)
-         /* dwarf2out_abstract_function won't emit a die if this is just a
-            declaration.  We must avoid setting DECL_ABSTRACT_ORIGIN in
-            that case, because that works only if we have a die.  */
-         && DECL_INITIAL (decl) != NULL_TREE)
+      else if (DECL_INLINE (decl) && ! DECL_ABSTRACT (decl)
+              && ! class_scope_p (context_die)
+              /* dwarf2out_abstract_function won't emit a die if this is just
+                 a declaration.  We must avoid setting DECL_ABSTRACT_ORIGIN in
+                 that case, because that works only if we have a die.  */
+              && DECL_INITIAL (decl) != NULL_TREE)
        {
          dwarf2out_abstract_function (decl);
          set_decl_origin_self (decl);
        }
-
-      if (debug_info_level > DINFO_LEVEL_TERSE)
+      /* Otherwise we're emitting the primary DIE for this decl.  */
+      else if (debug_info_level > DINFO_LEVEL_TERSE)
        {
          /* Before we describe the FUNCTION_DECL itself, make sure that we
             have described its return type.  */
index 9c7cb47dbb49da98614f846fb541f6f524f25cd4..370d14f4d88c52086523bc3ff4c6cb7aa5d5c504 100644 (file)
@@ -4444,7 +4444,13 @@ output_type (type, containing_scope)
              for (func_member = TYPE_METHODS (type);
                   func_member;
                   func_member = TREE_CHAIN (func_member))
-               output_decl (func_member, type);
+               {
+                 /* Don't include clones in the member list.  */
+                 if (DECL_ABSTRACT_ORIGIN (func_member))
+                   continue;
+
+                 output_decl (func_member, type);
+               }
            }
 
            --in_class;
index bcb3619458fa8850290755c9925284f8a2b4b975..270a9c5a115317e75491ab391c6e85fa46fb6a97 100644 (file)
@@ -139,6 +139,9 @@ function_cannot_inline_p (fndecl)
   register tree parms;
   rtx result;
 
+  if (DECL_UNINLINABLE (fndecl))
+    return N_("function cannot be inline");
+
   /* No inlines with varargs.  */
   if ((last && TREE_VALUE (last) != void_type_node)
       || current_function_varargs)
index b76b6ba4f1f11af0c8827ebb92522b9532727084..0e592bc2907592ffb805d1d96f0374e413cc158f 100644 (file)
@@ -2661,19 +2661,23 @@ note_deferral_of_defined_inline_function (decl)
   /* Generate the DWARF info for the "abstract" instance of a function
      which we may later generate inlined and/or out-of-line instances
      of.  */
-  if (write_symbols == DWARF_DEBUG && DECL_INLINE (decl))
+  if (write_symbols == DWARF_DEBUG
+      && (DECL_INLINE (decl) || DECL_ABSTRACT (decl))
+      && ! DECL_ABSTRACT_ORIGIN (decl))
     {
       /* The front-end may not have set CURRENT_FUNCTION_DECL, but the
         DWARF code expects it to be set in this case.  Intuitively,
         DECL is the function we just finished defining, so setting
         CURRENT_FUNCTION_DECL is sensible.  */
       tree saved_cfd = current_function_decl;
+      int was_abstract = DECL_ABSTRACT (decl);
       current_function_decl = decl;
 
       /* Let the DWARF code do its work.  */
       set_decl_abstract_flags (decl, 1);
       dwarfout_file_scope_decl (decl, 0);
-      set_decl_abstract_flags (decl, 0);
+      if (! was_abstract)
+       set_decl_abstract_flags (decl, 0);
 
       /* Reset CURRENT_FUNCTION_DECL.  */
       current_function_decl = saved_cfd;
index 60427b998b239e4b5db8b0ccec0d4f6693398234..3d2e38416f1b521a4e33bbb4f6dc828d4d86868f 100644 (file)
@@ -239,8 +239,6 @@ struct tree_common
            INTEGER_TYPE, ENUMERAL_TYPE, FIELD_DECL
        DECL_BUILT_IN_NONANSI in
            FUNCTION_DECL
-       TREE_PARMLIST in
-           TREE_PARMLIST (C++)
        SAVE_EXPR_NOPLACEHOLDER in
           SAVE_EXPR
 
@@ -1461,6 +1459,9 @@ struct tree_type
    where it is called.  */
 #define DECL_INLINE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.inline_flag)
 
+/* In a FUNCTION_DECL, nonzero if the function cannot be inlined.  */
+#define DECL_UNINLINABLE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.uninlinable)
+
 /* Nonzero in a FUNCTION_DECL means this is a built-in function
    that is not specified by ansi C and that users are supposed to be allowed
    to redefine for any purpose whatever.  */
@@ -1632,7 +1633,8 @@ struct tree_decl
   unsigned pointer_depth : 2;
   unsigned non_addressable : 1;
   unsigned user_align : 1;
-  /* Three unused bits.  */
+  unsigned uninlinable : 1;
+  /* Two unused bits.  */
 
   unsigned lang_flag_0 : 1;
   unsigned lang_flag_1 : 1;