[Bug c/81568] New: attribute always_inline honored even after attribute noinline

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jul 26 20:40:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81568

            Bug ID: 81568
           Summary: attribute always_inline honored even after attribute
                    noinline
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

GCC detects and warns about the obviously nonsensical combination of attribute
always_inline and noinline on the same function.  That's good so far as it goes
but there are a couple of minor problems with how GCC treats this situation:

When the conflicting attributes appear on distinct declarations of the same
function (the more likely case of the problem) it doesn't indicate which of the
two GCC accepts.  When the conflicting attributes appear the same declaration
of a function the warning makes it clear that it's the second of the two
attributes that's ignored.  Based on this one would expect the same to be true
in the first case (distinct declarations) but, as it turns out (and as the test
case below shows), that doesn't appear to be the case. 

$ cat x.c && gcc -O2 -S -Wall -Wextra -Wpedantic -o/dev/stdout x.c
int __attribute__ ((noinline)) f (int);
int __attribute__ ((always_inline)) f (int);

int f (int i) { return i > 1 ? i * f (i - 1) * f (i - 2) : i > 0 ? i * f (i -
1) : 1; }

int f1 (void)
{
  return f (123);
}

int __attribute__ ((always_inline, noinline)) g (int);
        .file   "x.c"
x.c:2:37: warning: declaration of ‘f’ with attribute ‘always_inline’ follows
declaration with attribute ‘noinline’ [-Wattributes]
 int __attribute__ ((always_inline)) f (int);
                                     ^
x.c:1:32: note: previous declaration of ‘f’ was here
 int __attribute__ ((noinline)) f (int);
                                ^
x.c:11:1: warning: ‘noinline’ attribute ignored due to conflict with attribute
‘always_inline’ [-Wattributes]
 int __attribute__ ((always_inline, noinline)) g (int);
 ^~~
x.c: In function ‘f1’:
x.c:4:5: error: inlining failed in call to always_inline ‘f’: function not
inlinable
 int f (int i) { return i > 1 ? i * f (i - 1) * f (i - 2) : i > 0 ? i * f (i -
1) : 1; }
     ^
x.c:8:10: note: called from here
   return f (123);
          ^~~~~~~


More information about the Gcc-bugs mailing list