1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct AnyT {
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename T>
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  operator T();
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_cvqual_ref(AnyT any) {
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  const int &cir = any;
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct AnyThreeLevelPtr {
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename T>
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  operator T***() const
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  {
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    T x = 0;
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    // FIXME: looks like we get this wrong, too!
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    // x = 0; // will fail if T is deduced to a const type
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           // (EDG and GCC get this wrong)
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return 0;
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X { };
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_deduce_with_qual(AnyThreeLevelPtr a3) {
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  int * const * const * const ip = a3;
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct AnyPtrMem {
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename Class, typename T>
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  operator T Class::*() const
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  {
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    T x = 0;
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    // FIXME: looks like we get this wrong, too!
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    // x = 0; // will fail if T is deduced to a const type.
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           // (EDG and GCC get this wrong)
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return 0;
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_deduce_ptrmem_with_qual(AnyPtrMem apm) {
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  const float X::* pm = apm;
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
45