------- Comment #30 from rguenth at gcc dot gnu dot org  2008-01-15 15:21 
-------
I suggest to tag the DECL with TREE_NO_WARNING if -fno-default-inline is set
and
check this.

On the trunk the functions are inlined anyway, because we inline small
functions by default (and the functions are pure anyway).  Also trunk
tests

 if (!flag_inline_small_functions && !DECL_DECLARED_INLINE_P (decl))
    {
      if (reason)
        *reason = N_("function not inline candidate");
      return false;

that is, it uses DECL_DECLARED_INLINE_P (!) which is not affected by
-fno-default-inline.

Better testcase:

volatile int x;
struct Foo {
            int a(int r) { return r & x; }
    virtual int b(int r) { return r & x; }
    static  int c(int r) { return r & x; }
};

int bar(int r) {
    Foo f; int k = 0;
    k |= f.a(r); k |= f.b(r); k |= f.a(r);
    return k;
}

which will on the trunk warn with -fno-inline only.

With the proposed approach we'd improve this to

./cc1plus -quiet -Winline t.ii -O -fno-default-inline -fno-inline
t.ii: In constructor 'Foo::Foo()':
t.ii:2: warning: function 'Foo::Foo() throw ()' can never be inlined because it
is suppressed using -fno-inline
t.ii: In function 'int bar(int)':
t.ii:2: warning: inlining failed in call to 'Foo::Foo() throw ()': function not
inlinable
t.ii:9: warning: called from here

that is, the compiler-generated methods are still marked inline and are not
affected by -fno-default-inline.


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu dot
                   |                            |org, hubicka at gcc dot gnu
                   |                            |dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18071

Reply via email to