blob: 9017d567132425f26f5c060e4ddb89d9388055ea [file] [log] [blame]
// { dg-do run }
// Copyright (C) 2000 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 3 Mar 2000 <nathan@codesourcery.com>
// __PRETTY_FUNCTION__, __FUNCTION__ and __function__ should have the
// type char const [X], where X is the right value for that particular function
static void const *strings[4];
static void const *tpls[4];
static unsigned pos = 0;
static int fail;
static void const *ptr = 0;
void unover (char const (*)[5]) {}
void foo (char const (*)[5]) {}
void foo (void *) {fail = 1;}
void foo (void const *) {fail = 1;}
void baz (char const (&)[5]) {}
template<unsigned I> void PV (char const (&objRef)[I])
{
strings[pos] = objRef;
tpls[pos] = __PRETTY_FUNCTION__;
pos++;
}
void fn ()
{
PV (__FUNCTION__);
PV (__func__);
PV (__PRETTY_FUNCTION__);
PV ("wibble");
}
void baz ()
{
ptr = __FUNCTION__;
// there should be no string const merging
if (ptr == "baz")
fail = 1;
// but all uses should be the same.
if (ptr != __FUNCTION__)
fail = 1;
}
int baz (int)
{
return ptr == __FUNCTION__;
}
int main ()
{
// make sure we actually emit the VAR_DECL when needed, and things have the
// expected type.
foo (&__FUNCTION__);
baz (__FUNCTION__);
unover (&__FUNCTION__);
if (fail)
return 1;
// __FUNCTION__ should be unique across functions with the same base name
// (it's a local static, _not_ a string).
baz ();
if (fail)
return 1;
if (baz (1))
return 1;
fn ();
// Check the names of fn. They should all be distinct strings (though two
// will have the same value).
if (strings[0] == strings[1])
return 1;
if (strings[0] == strings[2])
return 1;
if (strings[1] == strings[2])
return 1;
// check the names of the template functions so invoked
if (tpls[0] != tpls[1])
return 1;
if (tpls[0] == tpls[2])
return 1;
return 0;
}