view gcc/testsuite/g++.dg/ext/attr-copy.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

/* PR middle-end/88546 - Copy attribute unusable for weakrefs
   { dg-do compile }
   { dg-options "-O1 -Wall -fdump-tree-optimized" }
   { dg-require-weak "" } */

#define ATTR(...)   __attribute__ ((__VA_ARGS__))
#define ASRT(expr)   _Static_assert (expr, #expr)

extern "C" {

  ATTR (leaf, nothrow) int
  fnothrow ()
  {
    return 0;
  }

  static __typeof__ (fnothrow)
    ATTR (weakref ("fnothrow"), copy (fnothrow))
    alias_fnothrow;


  ATTR (leaf) int
  fthrow_none () throw ()
  {
    return 0;
  }

  // Verify that no warning is issued for the alias having less
  // restrictive attributes than the target: nothrow.
  static __typeof (fthrow_none)
    ATTR (weakref ("fthrow_none"), copy (fthrow_none))
    alias_fthrow_none;

  // Same as above but with no definition of the target.
  ATTR (leaf) int
  fthrow_none_nodef () throw ();

  static __typeof (fthrow_none_nodef)
    ATTR (weakref ("fthrow_none_nodef"), copy (fthrow_none_nodef))
    alias_fthrow_none_nodef;

  // And again but without using typeof to make sure the nothrow
  // bit is copied by attribute copy alone.
  static int
  ATTR (weakref ("fthrow_none_nodef"), copy (fthrow_none_nodef))
    alias_fthrow_none_nodef_func ();
}


struct UsrClass
{
  ~UsrClass ();
};

// Verify that the nothrow attribute/bit was copied to the alias and
// that no exception handling code is emitted in any of these calls.

int call_alias_fnothrow ()
{
  UsrClass usr;
  return alias_fnothrow ();
}

int call_alias_fthrow_none ()
{
  UsrClass usr;
  return alias_fthrow_none ();
}

int call_alias_fthrow_none_nodef ()
{
  UsrClass usr;
  return alias_fthrow_none_nodef ();
}

int call_alias_fthrow_none_nodef_func ()
{
  UsrClass usr;
  return alias_fthrow_none_nodef_func ();
}

// { dg-final { scan-tree-dump-not "__builtin_unwind" "optimized" } }