1 // RUN: %clang_cc1 -fsyntax-only %s -verify
8 void test_cvqual_ref(AnyT any) {
12 struct AnyThreeLevelPtr {
14 operator T***() const {
15 T x = 0; // expected-note 2{{declared const here}}
16 x = 0; // expected-error 2{{const-qualified type}}
24 void test_deduce_with_qual(AnyThreeLevelPtr a3) {
25 int * const * const * const ip1 = a3;
26 // FIXME: This is wrong; we are supposed to deduce 'T = int' here.
27 const int * const * const * const ip2 = a3; // expected-note {{instantiation of}}
28 // This one is correct, though.
29 const double * * * ip3 = a3; // expected-note {{instantiation of}}
33 template<typename Class, typename T>
34 operator T Class::*() const
36 // This is correct: we don't need a qualification conversion here, so we
37 // deduce 'T = const float'.
38 T x = 0; // expected-note {{declared const here}}
39 x = 0; // expected-error {{const-qualified type}}
44 void test_deduce_ptrmem_with_qual(AnyPtrMem apm) {
45 const float X::* pm = apm; // expected-note {{instantiation of}}
48 struct TwoLevelPtrMem {
49 template<typename Class1, typename Class2, typename T>
50 operator T Class1::*Class2::*() const
52 T x = 0; // expected-note 2{{declared const here}}
53 x = 0; // expected-error 2{{const-qualified type}}
58 void test_deduce_two_level_ptrmem_with_qual(TwoLevelPtrMem apm) {
59 // FIXME: This is wrong: we should deduce T = 'float'
60 const float X::* const X::* pm2 = apm; // expected-note {{instantiation of}}
61 // This is correct: we don't need a qualification conversion, so we directly
62 // deduce T = 'const double'
63 const double X::* X::* pm1 = apm; // expected-note {{instantiation of}}