summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.ext/pretty4.C
blob: 9017d567132425f26f5c060e4ddb89d9388055ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// { 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;
}