gigi.h (enum inline_status_t): New type.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 24 May 2013 09:31:33 +0000 (09:31 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 24 May 2013 09:31:33 +0000 (09:31 +0000)
* gcc-interface/gigi.h (enum inline_status_t): New type.
(create_subprog_decl): Adjust prototype.
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Procedure>: Adjust
calls to create_subprog_decl.
(get_minimal_subprog_decl): Likewise.
* gcc-interface/trans.c (gigi): Likewise.
(build_raise_check): Likewise.
(establish_gnat_vms_condition_handler): Likewise.
(Compilation_Unit_to_gnu): Likewise.
(gnat_to_gnu): Likewise.
* gcc-interface/utils.c (create_subprog_decl): Change inline_flag
parameter to inline_status and implement for suppressed inlining.

From-SVN: r199286

12 files changed:
gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/ada/gcc-interface/gigi.h
gcc/ada/gcc-interface/trans.c
gcc/ada/gcc-interface/utils.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/noinline2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/noinline2.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/specs/noinline1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/specs/noinline3.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/specs/noinline3_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/specs/noinline3_pkg.ads [new file with mode: 0644]

index af8c0262cba5b3fad1eb16b6f6bd446e01789b05..6657464ed92b8e5babd75bf6069c28f0d55ea764 100644 (file)
@@ -1,3 +1,18 @@
+2013-05-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/gigi.h (enum inline_status_t): New type.
+       (create_subprog_decl): Adjust prototype.
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Procedure>: Adjust
+       calls to create_subprog_decl.
+       (get_minimal_subprog_decl): Likewise.
+       * gcc-interface/trans.c (gigi): Likewise.
+       (build_raise_check): Likewise.
+       (establish_gnat_vms_condition_handler): Likewise.
+       (Compilation_Unit_to_gnu): Likewise.
+       (gnat_to_gnu): Likewise.
+       * gcc-interface/utils.c (create_subprog_decl): Change inline_flag
+       parameter to inline_status and implement for suppressed inlining.
+
 2013-05-24  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/ada-tree.h (LOOP_STMT_NO_UNROLL): New define.
index b859731231c6096237db5ec79b9f2fb089140cae..6e7c5c45a43ef09663cf5ff8aeeb9fd59ace3f9d 100644 (file)
@@ -4130,7 +4130,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
        tree gnu_stub_type = NULL_TREE, gnu_stub_name = NULL_TREE;
        tree gnu_ext_name = create_concat_name (gnat_entity, NULL);
        Entity_Id gnat_param;
-       bool inline_flag = Is_Inlined (gnat_entity);
+       enum inline_status_t inline_status
+         = Has_Pragma_No_Inline (gnat_entity)
+           ? is_suppressed
+           : (Is_Inlined (gnat_entity) ? is_enabled : is_disabled);
        bool public_flag = Is_Public (gnat_entity) || imported_p;
        bool extern_flag
          = (Is_Public (gnat_entity) && !definition) || imported_p;
@@ -4686,15 +4689,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
 
            gnu_decl
              = create_subprog_decl (gnu_entity_name, gnu_ext_name, gnu_type,
-                                    gnu_param_list, inline_flag, public_flag,
-                                    extern_flag, artificial_flag, attr_list,
-                                    gnat_entity);
+                                    gnu_param_list, inline_status,
+                                    public_flag, extern_flag, artificial_flag,
+                                    attr_list, gnat_entity);
            if (has_stub)
              {
                tree gnu_stub_decl
                  = create_subprog_decl (gnu_entity_name, gnu_stub_name,
                                         gnu_stub_type, gnu_stub_param_list,
-                                        inline_flag, true, extern_flag,
+                                        inline_status, true, extern_flag,
                                         false, attr_list, gnat_entity);
                SET_DECL_FUNCTION_STUB (gnu_decl, gnu_stub_decl);
              }
@@ -5427,7 +5430,7 @@ get_minimal_subprog_decl (Entity_Id gnat_entity)
 
   return
     create_subprog_decl (gnu_entity_name, gnu_ext_name, void_ftype, NULL_TREE,
-                        false, true, true, true, attr_list, gnat_entity);
+                        is_disabled, true, true, true, attr_list, gnat_entity);
 }
 
 /* Return whether the E_Subprogram_Type/E_Function/E_Procedure GNAT_ENTITY is
index 6fc3f347ed31c986fc6e6de2ce79ade9c61813e5..5dee7b56fb19c89ab26822296302fcdaddc3edba 100644 (file)
@@ -430,6 +430,17 @@ enum exception_info_kind
   exception_column
 };
 
+/* Define the inline status of a subprogram.  */
+enum inline_status_t
+{
+  /* Inlining is suppressed for the subprogram.  */
+  is_suppressed,
+  /* No inlining is requested for the subprogram.  */
+  is_disabled,
+  /* Inlining is requested for the subprogram.  */
+  is_enabled
+};
+
 extern GTY(()) tree gnat_std_decls[(int) ADT_LAST];
 extern GTY(()) tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
 extern GTY(()) tree gnat_raise_decls_ext[(int) LAST_REASON_CODE + 1];
@@ -718,13 +729,14 @@ extern tree create_label_decl (tree, Node_Id);
    node), PARAM_DECL_LIST is the list of the subprogram arguments (a list of
    PARM_DECL nodes chained through the DECL_CHAIN field).
 
-   INLINE_FLAG, PUBLIC_FLAG, EXTERN_FLAG, ARTIFICIAL_FLAG and ATTR_LIST are
+   INLINE_STATUS, PUBLIC_FLAG, EXTERN_FLAG, ARTIFICIAL_FLAG and ATTR_LIST are
    used to set the appropriate fields in the FUNCTION_DECL.  GNAT_NODE is
    used for the position of the decl.  */
 extern tree create_subprog_decl (tree subprog_name, tree asm_name,
                                 tree subprog_type, tree param_decl_list,
-                                bool inline_flag, bool public_flag,
-                                bool extern_flag, bool artificial_flag,
+                                enum inline_status_t inline_status,
+                                bool public_flag, bool extern_flag,
+                                bool artificial_flag,
                                 struct attrib *attr_list, Node_Id gnat_node);
 
 /* Set up the framework for generating code for SUBPROG_DECL, a subprogram
index d95b3f6a3ce4c862c485fa1db8d4e81608b3c1d8..f854dbe1c1fdf81d909d812c128642d468acdaf3 100644 (file)
@@ -413,16 +413,16 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
      memory.  */
   malloc_decl
     = create_subprog_decl (get_identifier ("__gnat_malloc"), NULL_TREE,
-                          ftype, NULL_TREE, false, true, true, true, NULL,
-                          Empty);
+                          ftype, NULL_TREE, is_disabled, true, true, true,
+                          NULL, Empty);
   DECL_IS_MALLOC (malloc_decl) = 1;
 
   /* malloc32 is a function declaration tree for a function to allocate
      32-bit memory on a 64-bit system.  Needed only on 64-bit VMS.  */
   malloc32_decl
     = create_subprog_decl (get_identifier ("__gnat_malloc32"), NULL_TREE,
-                          ftype, NULL_TREE, false, true, true, true, NULL,
-                          Empty);
+                          ftype, NULL_TREE, is_disabled, true, true, true,
+                          NULL, Empty);
   DECL_IS_MALLOC (malloc32_decl) = 1;
 
   /* free is a function declaration tree for a function to free memory.  */
@@ -431,14 +431,16 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
                           build_function_type_list (void_type_node,
                                                     ptr_void_type_node,
                                                     NULL_TREE),
-                          NULL_TREE, false, true, true, true, NULL, Empty);
+                          NULL_TREE, is_disabled, true, true, true, NULL,
+                          Empty);
 
   /* This is used for 64-bit multiplication with overflow checking.  */
   mulv64_decl
     = create_subprog_decl (get_identifier ("__gnat_mulv64"), NULL_TREE,
                           build_function_type_list (int64_type, int64_type,
                                                     int64_type, NULL_TREE),
-                          NULL_TREE, false, true, true, true, NULL, Empty);
+                          NULL_TREE, is_disabled, true, true, true, NULL,
+                          Empty);
 
   /* Name of the _Parent field in tagged record types.  */
   parent_name_id = get_identifier (Get_Name_String (Name_uParent));
@@ -459,7 +461,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
     = create_subprog_decl
       (get_identifier ("system__soft_links__get_jmpbuf_address_soft"),
        NULL_TREE, build_function_type_list (jmpbuf_ptr_type, NULL_TREE),
-       NULL_TREE, false, true, true, true, NULL, Empty);
+       NULL_TREE, is_disabled, true, true, true, NULL, Empty);
   DECL_IGNORED_P (get_jmpbuf_decl) = 1;
 
   set_jmpbuf_decl
@@ -467,7 +469,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
       (get_identifier ("system__soft_links__set_jmpbuf_address_soft"),
        NULL_TREE, build_function_type_list (void_type_node, jmpbuf_ptr_type,
                                            NULL_TREE),
-       NULL_TREE, false, true, true, true, NULL, Empty);
+       NULL_TREE, is_disabled, true, true, true, NULL, Empty);
   DECL_IGNORED_P (set_jmpbuf_decl) = 1;
 
   /* setjmp returns an integer and has one operand, which is a pointer to
@@ -477,7 +479,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
       (get_identifier ("__builtin_setjmp"), NULL_TREE,
        build_function_type_list (integer_type_node, jmpbuf_ptr_type,
                                 NULL_TREE),
-       NULL_TREE, false, true, true, true, NULL, Empty);
+       NULL_TREE, is_disabled, true, true, true, NULL, Empty);
   DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
   DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
 
@@ -487,7 +489,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
     = create_subprog_decl
       (get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
        build_function_type_list (void_type_node, jmpbuf_ptr_type, NULL_TREE),
-       NULL_TREE, false, true, true, true, NULL, Empty);
+       NULL_TREE, is_disabled, true, true, true, NULL, Empty);
   DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
   DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
 
@@ -497,27 +499,27 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
 
   begin_handler_decl
     = create_subprog_decl (get_identifier ("__gnat_begin_handler"), NULL_TREE,
-                          ftype, NULL_TREE, false, true, true, true, NULL,
-                          Empty);
+                          ftype, NULL_TREE, is_disabled, true, true, true,
+                          NULL, Empty);
   DECL_IGNORED_P (begin_handler_decl) = 1;
 
   end_handler_decl
     = create_subprog_decl (get_identifier ("__gnat_end_handler"), NULL_TREE,
-                          ftype, NULL_TREE, false, true, true, true, NULL,
-                          Empty);
+                          ftype, NULL_TREE, is_disabled, true, true, true,
+                          NULL, Empty);
   DECL_IGNORED_P (end_handler_decl) = 1;
 
   unhandled_except_decl
     = create_subprog_decl (get_identifier ("__gnat_unhandled_except_handler"),
                           NULL_TREE,
-                          ftype, NULL_TREE, false, true, true, true, NULL,
-                          Empty);
+                          ftype, NULL_TREE, is_disabled, true, true, true,
+                          NULL, Empty);
   DECL_IGNORED_P (unhandled_except_decl) = 1;
 
   reraise_zcx_decl
     = create_subprog_decl (get_identifier ("__gnat_reraise_zcx"), NULL_TREE,
-                          ftype, NULL_TREE, false, true, true, true, NULL,
-                          Empty);
+                          ftype, NULL_TREE, is_disabled, true, true, true,
+                          NULL, Empty);
   /* Indicate that these never return.  */
   DECL_IGNORED_P (reraise_zcx_decl) = 1;
   TREE_THIS_VOLATILE (reraise_zcx_decl) = 1;
@@ -537,7 +539,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
                                     build_pointer_type
                                     (unsigned_char_type_node),
                                     integer_type_node, NULL_TREE),
-          NULL_TREE, false, true, true, true, NULL, Empty);
+          NULL_TREE, is_disabled, true, true, true, NULL, Empty);
       TREE_THIS_VOLATILE (decl) = 1;
       TREE_SIDE_EFFECTS (decl) = 1;
       TREE_TYPE (decl)
@@ -570,7 +572,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
       (get_identifier ("system__soft_links__get_gnat_exception"), NULL_TREE,
        build_function_type_list (build_pointer_type (except_type_node),
                                 NULL_TREE),
-     NULL_TREE, false, true, true, true, NULL, Empty);
+     NULL_TREE, is_disabled, true, true, true, NULL, Empty);
   DECL_IGNORED_P (get_excptr_decl) = 1;
 
   raise_nodefer_decl
@@ -579,7 +581,7 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
        build_function_type_list (void_type_node,
                                 build_pointer_type (except_type_node),
                                 NULL_TREE),
-       NULL_TREE, false, true, true, true, NULL, Empty);
+       NULL_TREE, is_disabled, true, true, true, NULL, Empty);
 
   /* Indicate that it never returns.  */
   TREE_THIS_VOLATILE (raise_nodefer_decl) = 1;
@@ -752,7 +754,7 @@ build_raise_check (int check, enum exception_info_kind kind)
   result
     = create_subprog_decl (get_identifier (Name_Buffer),
                           NULL_TREE, ftype, NULL_TREE,
-                          false, true, true, true, NULL, Empty);
+                          is_disabled, true, true, true, NULL, Empty);
 
   /* Indicate that it never returns.  */
   TREE_THIS_VOLATILE (result) = 1;
@@ -2813,7 +2815,7 @@ establish_gnat_vms_condition_handler (void)
                                                         ptr_void_type_node,
                                                         ptr_void_type_node,
                                                         NULL_TREE),
-                              NULL_TREE, false, true, true, true, NULL,
+                              NULL_TREE, is_disabled, true, true, true, NULL,
                               Empty);
 
       /* ??? DECL_CONTEXT shouldn't have been set because of DECL_EXTERNAL.  */
@@ -4867,7 +4869,7 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
   tree gnu_elab_proc_decl
     = create_subprog_decl
       (create_concat_name (gnat_unit_entity, body_p ? "elabb" : "elabs"),
-       NULL_TREE, void_ftype, NULL_TREE, false, true, false, true, NULL,
+       NULL_TREE, void_ftype, NULL_TREE, is_disabled, true, false, true, NULL,
        gnat_unit);
   struct elab_info *info;
 
@@ -5795,7 +5797,7 @@ gnat_to_gnu (Node_Id gnat_node)
            create_subprog_decl (create_concat_name
                                 (Entity (Prefix (gnat_node)),
                                  attr == Attr_Elab_Body ? "elabb" : "elabs"),
-                                NULL_TREE, void_ftype, NULL_TREE, false,
+                                NULL_TREE, void_ftype, NULL_TREE, is_disabled,
                                 true, true, true, NULL, gnat_node);
 
        gnu_result = Attribute_to_gnu (gnat_node, &gnu_result_type, attr);
index 309cff6ad32c04bee12cbeced202afd934f443e1..0906c0c319de27cb32d9e446e162d729b007f241 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                          C Implementation File                           *
  *                                                                          *
- *          Copyright (C) 1992-2012, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2013, Free Software Foundation, Inc.         *
  *                                                                          *
  * GNAT is free software;  you can  redistribute it  and/or modify it under *
  * terms of the  GNU General Public License as published  by the Free Soft- *
@@ -2621,14 +2621,14 @@ create_label_decl (tree label_name, Node_Id gnat_node)
    node), PARAM_DECL_LIST is the list of the subprogram arguments (a list of
    PARM_DECL nodes chained through the DECL_CHAIN field).
 
-   INLINE_FLAG, PUBLIC_FLAG, EXTERN_FLAG, ARTIFICIAL_FLAG and ATTR_LIST are
+   INLINE_STATUS, PUBLIC_FLAG, EXTERN_FLAG, ARTIFICIAL_FLAG and ATTR_LIST are
    used to set the appropriate fields in the FUNCTION_DECL.  GNAT_NODE is
    used for the position of the decl.  */
 
 tree
 create_subprog_decl (tree subprog_name, tree asm_name, tree subprog_type,
-                    tree param_decl_list, bool inline_flag, bool public_flag,
-                    bool extern_flag, bool artificial_flag,
+                    tree param_decl_list, enum inline_status_t inline_status,
+                    bool public_flag, bool extern_flag, bool artificial_flag,
                     struct attrib *attr_list, Node_Id gnat_node)
 {
   tree subprog_decl = build_decl (input_location, FUNCTION_DECL, subprog_name,
@@ -2642,7 +2642,7 @@ create_subprog_decl (tree subprog_name, tree asm_name, tree subprog_type,
      function in the current unit since it is private to the other unit.
      We could inline the nested function as well but it's probably better
      to err on the side of too little inlining.  */
-  if (!inline_flag
+  if (inline_status != is_enabled
       && !public_flag
       && current_function_decl
       && DECL_DECLARED_INLINE_P (current_function_decl)
@@ -2651,8 +2651,24 @@ create_subprog_decl (tree subprog_name, tree asm_name, tree subprog_type,
 
   DECL_ARTIFICIAL (subprog_decl) = artificial_flag;
   DECL_EXTERNAL (subprog_decl) = extern_flag;
-  DECL_DECLARED_INLINE_P (subprog_decl) = inline_flag;
-  DECL_NO_INLINE_WARNING_P (subprog_decl) = inline_flag && artificial_flag;
+
+  switch (inline_status)
+    {
+    case is_suppressed:
+      DECL_UNINLINABLE (subprog_decl) = 1;
+      break;
+
+    case is_disabled:
+      break;
+
+    case is_enabled:
+      DECL_DECLARED_INLINE_P (subprog_decl) = 1;
+      DECL_NO_INLINE_WARNING_P (subprog_decl) = artificial_flag;
+      break;
+
+    default:
+      gcc_unreachable ();
+    }
 
   TREE_PUBLIC (subprog_decl) = public_flag;
   TREE_READONLY (subprog_decl) = TYPE_READONLY (subprog_type);
index ca359e4ef6866bf04202a8b5f0abbe55efa103ae..b8455ce21476a2240f93ceecbccaeac2e70fe62b 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/specs/noinline1.ads: New test.
+       * gnat.dg/noinline2.ad[sb]: Likewise.
+       * gnat.dg/specs/noinline3.ads: Likewise.
+       * gnat.dg/specs/noinline3_pkg.ad[sb]: New helper.
+
 2013-05-24  Alexander Ivchenko  <alexander.ivchenko@intel.com>
 
        PR tree-ssa/57385
diff --git a/gcc/testsuite/gnat.dg/noinline2.adb b/gcc/testsuite/gnat.dg/noinline2.adb
new file mode 100644 (file)
index 0000000..0c26ede
--- /dev/null
@@ -0,0 +1,22 @@
+-- { dg-do compile }
+-- { dg-options "-O2 -fdump-tree-optimized" }
+
+package body Noinline2 is
+
+  function Inner (A, B : Integer) return Integer;
+  pragma No_Inline (Inner);
+
+  function Inner (A, B : Integer) return Integer is
+  begin
+    return A + B;
+  end;
+
+  function F (A, B : Integer) return Integer is
+  begin
+    return Inner (A, B) + Inner (A, -B);
+  end;
+
+end Noinline2;
+
+-- { dg-final { scan-tree-dump-times "noinline2.inner" 2 "optimized"  } }
+-- { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc/testsuite/gnat.dg/noinline2.ads b/gcc/testsuite/gnat.dg/noinline2.ads
new file mode 100644 (file)
index 0000000..f0a1853
--- /dev/null
@@ -0,0 +1,5 @@
+package Noinline2 is
+
+  function F (A, B : Integer) return Integer;
+
+end Noinline2;
diff --git a/gcc/testsuite/gnat.dg/specs/noinline1.ads b/gcc/testsuite/gnat.dg/specs/noinline1.ads
new file mode 100644 (file)
index 0000000..c50ac18
--- /dev/null
@@ -0,0 +1,21 @@
+-- { dg-do compile }
+
+package Noinline1 is
+
+  procedure Proc1;
+  pragma Inline (Proc1);
+  pragma No_Inline (Proc1); -- { dg-warning "both specified" }
+
+  procedure Proc2;
+  pragma No_Inline (Proc2);
+  pragma Inline (Proc2); -- { dg-warning "both specified" }
+
+  procedure Proc3;
+  pragma Inline_Always (Proc3);
+  pragma No_Inline (Proc3); -- { dg-error "mutually exclusive" }
+
+  procedure Proc4;
+  pragma No_Inline (Proc4);
+  pragma Inline_Always (Proc4); -- { dg-error "mutually exclusive" }
+
+end Noinline1;
diff --git a/gcc/testsuite/gnat.dg/specs/noinline3.ads b/gcc/testsuite/gnat.dg/specs/noinline3.ads
new file mode 100644 (file)
index 0000000..06a33fb
--- /dev/null
@@ -0,0 +1,9 @@
+-- { dg-do compile }
+-- { dg-options "-O2 -fdump-tree-optimized" }
+
+with Noinline3_Pkg;
+
+package Noinline3 is new Noinline3_Pkg (0);
+
+-- { dg-final { scan-tree-dump-times "noinline3.inner" 2 "optimized"  } }
+-- { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc/testsuite/gnat.dg/specs/noinline3_pkg.adb b/gcc/testsuite/gnat.dg/specs/noinline3_pkg.adb
new file mode 100644 (file)
index 0000000..f19826d
--- /dev/null
@@ -0,0 +1,16 @@
+package body Noinline3_Pkg is
+
+  function Inner (A, B : Integer) return Integer;
+  pragma No_Inline (Inner);
+
+  function Inner (A, B : Integer) return Integer is
+  begin
+    return A + B;
+  end;
+
+  function F (A, B : Integer) return Integer is
+  begin
+    return Inner (A, B) + Inner (A, -B);
+  end;
+
+end Noinline3_Pkg;
diff --git a/gcc/testsuite/gnat.dg/specs/noinline3_pkg.ads b/gcc/testsuite/gnat.dg/specs/noinline3_pkg.ads
new file mode 100644 (file)
index 0000000..b1fa450
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-excess-errors "cannot generate code" }
+
+generic
+
+  I : Integer;
+
+package Noinline3_Pkg is
+
+  function F (A, B : Integer) return Integer;
+
+end Noinline3_Pkg;