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