1/* Test __attribute__((gnu_inline)).
2
3   Check that __attribute__((gnu_inline)) has no effect, in the
4   absence of extern and/or inline.
5
6   Check that we don't get out-of-line definitions for extern inline
7   gnu_inline functions, regardless of declarations or definitions.
8
9   Check that such functions can be overridden by out-of-line
10   definitions.
11
12 */
13
14/* { dg-do compile } */
15/* { dg-options "-O" } */ // such that static functions are optimized out
16/* { dg-final { scan-assembler "func1" } } */
17/* { dg-final { scan-assembler "func2" } } */
18/* { dg-final { scan-assembler-not "func3" } } */
19/* { dg-final { scan-assembler "func4" } } */
20/* { dg-final { scan-assembler-not "func5" } } */
21
22#include "gnu-inline-common.h"
23
24#undef fn
25#define fn pfx(func1) // must be emitted out-of-line
26gnuindef(fn, 0)
27def(, fn, 2)
28
29#undef fn
30#define fn pfx(func2) // must be emitted out-of-line
31decl(extern, fn)
32gnuindef(fn, 0)
33def(, fn, 2)
34
35#undef fn
36#define fn pfx(func3) // must not be emitted
37decl(extern, fn)
38gnuindef(fn, 0)
39
40#undef fn
41#define fn pfx(func4) // must be emitted out-of-line
42decl(extern, fn)
43gnuindef(fn, 0)
44def(, fn, 1)
45
46#undef fn
47#define fn pfx(func5) // must NOT be emitted, because it's static and unused
48decl(static, fn)
49gnuindef(fn, 0)
50def(, fn, 1)
51