// Bug c++/84617 - new test cases g++.dg/ext/attr-const.C and
// g++.dg/ext/attr-pure.C fail
// { dg-do compile }
// { dg-options "-O -Wall -fdump-tree-optimized" }
static char a[8];
void* __attribute__ ((malloc))
func_malloc_none (unsigned);
void*
func_alloc_none (unsigned);         // redeclare with no attribute
void func_malloc_none_failed ();
void test_func_malloc_none (void)
{
  void *p = func_malloc_none (1);
  if (!p)
    return;
  if (p == a)                       // must be false
    func_malloc_none_failed ();     // should be eliminated
  // Verify that the call to func_malloc_none_failed() is eliminated.
  // { dg-final { scan-tree-dump-not "func_malloc_none_failed" "optimized" } }
}
void*
func_none_malloc (unsigned);
void*  __attribute__ ((malloc))
func_none_malloc (unsigned);         // redeclare with an attribute
void func_none_malloc_failed ();
void test_func_none_malloc (void)
{
  void *p = func_none_malloc (1);
  if (!p)
    return;
  if (p == a)                       // must be false
    func_none_malloc_failed ();     // should be eliminated
  // Verify that the call to func_none_malloc_failed() is eliminated.
  // { dg-final { scan-tree-dump-not "func_none_malloc_failed" "optimized" } }
}
template <class>
void* __attribute__ ((malloc))
templ_malloc_none (unsigned);
template <class>
void*
templ_malloc_none (unsigned);       // redeclare with no attribute
void templ_malloc_none_failed ();
void test_templ_malloc_none (void)
{
  void *p = templ_malloc_none<void>(1);
  if (!p)
    return;
  if (p == a)                       // must be false
    templ_malloc_none_failed ();    // should be eliminated
  // Verify that the call to templ_malloc_none_failed() is eliminated.
  // { dg-final { scan-tree-dump-not "templ_malloc_none_failed" "optimized" } }
}
template <class>
void*
templ_none_malloc (unsigned);
template <class>
void* __attribute__ ((malloc))
templ_none_malloc (unsigned);       // redeclared with an attribute
void templ_none_malloc_failed ();
void test_templ_none_malloc (void)
{
  void *p = templ_none_malloc<void>(1);
  if (!p)
    return;
  if (p == a)                       // must be false
    templ_none_malloc_failed ();    // should be eliminated
  // Verify that the call to templ_none_malloc_failed() is eliminated.
  // { dg-final { scan-tree-dump-not "templ_none_malloc_failed" "optimized" } }
}