1// { dg-do run  }
2// Copyright (C) 2000 Free Software Foundation, Inc.
3// Contributed by Nathan Sidwell 18 Jan 2001 <nathan@codesourcery.com>
4
5// Bug 1617. We didn't resolve partial ordering properly. The std is rather
6// vague about it anyway, DR 214 talks about this.
7
8extern "C" int puts (char const *);
9
10template <typename T> int Foo (T *) {puts (__PRETTY_FUNCTION__); return 1;}
11template <typename T> int Foo (T &) {puts (__PRETTY_FUNCTION__); return 2;}
12template <typename T> int Foo (T const &) {puts (__PRETTY_FUNCTION__); return 3;}
13
14template <typename T> int Bar (T const *const &) {puts (__PRETTY_FUNCTION__); return 4;}
15template <typename T> int Bar (T *const &) {puts (__PRETTY_FUNCTION__); return 5;}
16template <typename T> int Bar (T *) {puts (__PRETTY_FUNCTION__); return 6;}
17
18template <typename T> int Quux (T *const &) {puts (__PRETTY_FUNCTION__); return 7;}
19template <typename T> int Quux (T const &) {puts (__PRETTY_FUNCTION__); return 8;}
20
21
22int Baz (int const *ptr, int *ptr2)
23{
24  if (Foo (ptr) != 1)
25    return 1;
26  if (Foo (ptr2) != 1)
27    return 2;
28  if (Foo (*ptr) != 3)
29    return 3;
30  if (Foo (*ptr2) != 2)
31    return 4;
32
33  if (Bar (ptr) != 4)
34    return 5;
35
36  if (Quux (ptr) != 7)
37    return 5;
38  if (Quux (ptr2) != 7)
39    return 6;
40
41  return 0;
42}
43
44int main ()
45{
46  return Baz (0, 0);
47}
48