From: Richard Smith Date: Sun, 16 Oct 2016 06:23:29 +0000 (+0000) Subject: Extend this test and make it a bit clearer which cases Clang is getting wrong. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93238dfb22fa5a717809c2c49eac444913cf5596;p=clang Extend this test and make it a bit clearer which cases Clang is getting wrong. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284331 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.conv/p4.cpp b/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.conv/p4.cpp index 4dca820c19..b45ed96d14 100644 --- a/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.conv/p4.cpp +++ b/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.conv/p4.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only %s +// RUN: %clang_cc1 -fsyntax-only %s -verify struct AnyT { template @@ -11,34 +11,54 @@ void test_cvqual_ref(AnyT any) { struct AnyThreeLevelPtr { template - operator T***() const - { - T x = 0; - // FIXME: looks like we get this wrong, too! - // x = 0; // will fail if T is deduced to a const type - // (EDG and GCC get this wrong) - return 0; + operator T***() const { + T x = 0; // expected-note 2{{declared const here}} + x = 0; // expected-error 2{{const-qualified type}} + T ***p; + return p; } }; struct X { }; void test_deduce_with_qual(AnyThreeLevelPtr a3) { - int * const * const * const ip = a3; + int * const * const * const ip1 = a3; + // FIXME: This is wrong; we are supposed to deduce 'T = int' here. + const int * const * const * const ip2 = a3; // expected-note {{instantiation of}} + // This one is correct, though. + const double * * * ip3 = a3; // expected-note {{instantiation of}} } struct AnyPtrMem { template operator T Class::*() const { - T x = 0; - // FIXME: looks like we get this wrong, too! - // x = 0; // will fail if T is deduced to a const type. - // (EDG and GCC get this wrong) + // This is correct: we don't need a qualification conversion here, so we + // deduce 'T = const float'. + T x = 0; // expected-note {{declared const here}} + x = 0; // expected-error {{const-qualified type}} return 0; } }; void test_deduce_ptrmem_with_qual(AnyPtrMem apm) { - const float X::* pm = apm; + const float X::* pm = apm; // expected-note {{instantiation of}} +} + +struct TwoLevelPtrMem { + template + operator T Class1::*Class2::*() const + { + T x = 0; // expected-note 2{{declared const here}} + x = 0; // expected-error 2{{const-qualified type}} + return 0; + } +}; + +void test_deduce_two_level_ptrmem_with_qual(TwoLevelPtrMem apm) { + // FIXME: This is wrong: we should deduce T = 'float' + const float X::* const X::* pm2 = apm; // expected-note {{instantiation of}} + // This is correct: we don't need a qualification conversion, so we directly + // deduce T = 'const double' + const double X::* X::* pm1 = apm; // expected-note {{instantiation of}} }