// PR c++/6794
|
// PR c++/6794
|
// Test whether __PRETTY_FUNCTION__ works in templates, functions and
|
// Test whether __PRETTY_FUNCTION__ works in templates, functions and
|
// in initializers at global scope
|
// in initializers at global scope
|
// { dg-do compile }
|
// { dg-do compile }
|
// { dg-options "" }
|
// { dg-options "" }
|
|
|
extern "C" void __assert_fail (const char *, const char *,
|
extern "C" void __assert_fail (const char *, const char *,
|
unsigned int, const char *)
|
unsigned int, const char *)
|
throw() __attribute__((noreturn));
|
throw() __attribute__((noreturn));
|
extern "C" void abort (void);
|
extern "C" void abort (void);
|
extern "C" void exit (int);
|
extern "C" void exit (int);
|
|
|
#define str(expr) #expr
|
#define str(expr) #expr
|
#define assert(expr) \
|
#define assert(expr) \
|
((expr) ? 0 : (__assert_fail (str(expr), __FILE__, __LINE__, \
|
((expr) ? 0 : (__assert_fail (str(expr), __FILE__, __LINE__, \
|
__PRETTY_FUNCTION__), 0))
|
__PRETTY_FUNCTION__), 0))
|
|
|
int __attribute__((noinline))
|
int __attribute__((noinline))
|
foo (void)
|
foo (void)
|
{
|
{
|
return 1;
|
return 1;
|
}
|
}
|
|
|
template int
|
template int
|
bar (T)
|
bar (T)
|
{
|
{
|
return (assert (foo ()), 1);
|
return (assert (foo ()), 1);
|
}
|
}
|
|
|
template<> int
|
template<> int
|
bar (int)
|
bar (int)
|
{
|
{
|
return (assert (foo ()), 2);
|
return (assert (foo ()), 2);
|
}
|
}
|
|
|
int a = (assert (foo ()), 1);
|
int a = (assert (foo ()), 1);
|
int b = (assert (foo ()), 2);
|
int b = (assert (foo ()), 2);
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
double c = 1.0;
|
double c = 1.0;
|
unsigned char *d = 0;
|
unsigned char *d = 0;
|
int e = (assert (foo ()), 3);
|
int e = (assert (foo ()), 3);
|
|
|
bar (c);
|
bar (c);
|
bar (d);
|
bar (d);
|
bar (e);
|
bar (e);
|
}
|
}
|
|
|
namespace N
|
namespace N
|
{
|
{
|
int f = (assert (foo ()), 4);
|
int f = (assert (foo ()), 4);
|
}
|
}
|
|
|
void __attribute__((noinline))
|
void __attribute__((noinline))
|
__assert_fail (const char *cond, const char *file, unsigned int line,
|
__assert_fail (const char *cond, const char *file, unsigned int line,
|
const char *pretty) throw ()
|
const char *pretty) throw ()
|
{
|
{
|
abort ();
|
abort ();
|
}
|
}
|
|
|
// { dg-final { scan-assembler "int bar\\(T\\).*with T = int" } }
|
// { dg-final { scan-assembler "int bar\\(T\\).*with T = int" } }
|
// { dg-final { scan-assembler "top level" } }
|
// { dg-final { scan-assembler "top level" } }
|
// { dg-final { scan-assembler "int main\\(\\)" } }
|
// { dg-final { scan-assembler "int main\\(\\)" } }
|
// { dg-final { scan-assembler "int bar\\(T\\).*with T = double" } }
|
// { dg-final { scan-assembler "int bar\\(T\\).*with T = double" } }
|
// { dg-final { scan-assembler "int bar\\(T\\).*with T = unsigned char\*" } }
|
// { dg-final { scan-assembler "int bar\\(T\\).*with T = unsigned char\*" } }
|
|
|