1// { dg-do assemble  }
2// { dg-options "-Wreturn-type" }
3// GROUPS passed error-reporting
4
5// DR 295 allows qualification via typedef
6
7template <char C>
8class badoo
9{
10};
11
12template <int (*F) (int)>
13class doowop
14{
15};
16
17struct A
18{
19  int a;
20  ~A () { a = 0; }
21  operator int () { return a; }
22};
23
24extern "C" int atoi (char *);
25
26int (*fee)(char *) = atoi;
27int (**bar)(char *) = &fee;
28
29char *s = "4";
30char **sp = &s;
31char ***spp = &sp;
32
33int foo (int a = (**bar) (s))
34{
35   return doowop<foo>::bar; // { dg-error "" } not a member
36}
37
38int foo2 (int (*a)(int) = &foo)
39{
40   undef4 (1); // { dg-error "" } implicit declaration
41  return 1;
42}
43
44class X{
45  class Y{};			// { dg-error "" } private
46};
47
48typedef int const * bart ();
49//The following is DR295 dependant
50typedef bart const * const * bar2;
51typedef bart volatile * const * bar2v;
52
53bar2 baz (X::Y y)	        // { dg-error "" } in this context
54{
55  X::Y f;			// { dg-error "" } in this context
56  bar2 wa [5];
57  wa[0] = baz(f);
58  undef2 (1); // { dg-error "" } implicit declaration
59}
60
61int ninny ()
62{
63  struct A
64    {
65	  static int ninny2 () { return badoo<'\001'>::foo; } // { dg-error "" } not a member
66    };
67
68  return A::ninny2();
69}
70
71int darg (char X::*p)
72{
73   undef3 (1); // { dg-error "" } implicit declaration
74}
75