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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-08-11
                 CC|                            |msebor at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Confirmed with the C++ test case below.  I'll look into the warning but I
wonder if in addition it would be worth to add some intrinsics to query and
manipulate attributes.  For instance, if the built-in __builtin_attributes__(X)
extracted all attributes from a declaration or a type it could be used to
easily declare __foo with all the same attributes as foo:

  void foo (void) __attribute__ ((nothrow));
  __typeof__ (foo) __foo __attribute ((__builtin_attributes__ ((foo))));

Attributes could be removed by using another built-in, say
__builtin_remove_attribute.


$ cat z.c && gcc -O2 -S -Wall -Wextra -Wpedantic -Wunused
-fdump-tree-optimized=/dev/stdout -xc++ z.c
extern "C" {

void foo (void) __attribute__ ((nothrow));
__typeof__ (foo) __foo;

void bar (void) __attribute__ ((nothrow));
__typeof__ (bar) __bar __attribute__ ((nothrow));

#if DEF

void __foo (void) { }
void __bar (void) { }

void foo (void) __attribute__ ((weak, alias ("__foo")));
void bar (void) __attribute__ ((weak, alias ("__bar")));

#else

void call_foo (void)
{
  try {
    __foo ();
  }
  catch (...) {
    __builtin_abort ();
  }
}

void call_bar (void)
{
  try {
    __bar ();
  }
  catch (...) {
    __builtin_abort ();
  }
}

#endif

}

;; Function void call_foo() (call_foo, funcdef_no=0, decl_uid=2282,
cgraph_uid=0, symbol_order=0)

void call_foo() ()
{
  void * _1;

  <bb 2> [100.00%] [count: INV]:
  __foo ();

  <bb 3> [100.00%] [count: INV]:
  return;

  <bb 4> [0.00%] [count: INV]:
<L0>:
  _1 = __builtin_eh_pointer (1);
  __cxa_begin_catch (_1);
  __builtin_abort ();

}



;; Function void call_bar() (call_bar, funcdef_no=1, decl_uid=2286,
cgraph_uid=1, symbol_order=1)

void call_bar() ()
{
  void * _1;

  <bb 2> [100.00%] [count: INV]:
  __bar (); [tail call]
  return;

}

Reply via email to