From 64e8d5b1baaa478c40931d290bf30687a6c93dac Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov Date: Sun, 5 Jan 2025 15:49:55 +0400 Subject: [PATCH] [clang] Add tests from CWG156 to CWG1111 (dual-scope lookup for conversion-function-ids) (#121654) This patch adds test from [CWG156](https://cplusplus.github.io/CWG/issues/156.html) to [CWG1111](https://cplusplus.github.io/CWG/issues/1111.html) test, and downgrades the latter to partial availability. The most relevant piece of current wording is [[basic.lookup.unqual]/5](https://eel.is/c++draft/basic.lookup#unqual-5): > An unqualified name that is a component name ([[expr.prim.id.unqual]](https://eel.is/c++draft/expr.prim.id.unqual)) of a [type-specifier](https://eel.is/c++draft/dcl.type.general#nt:type-specifier) or [ptr-operator](https://eel.is/c++draft/dcl.decl.general#nt:ptr-operator) of a [conversion-type-id](https://eel.is/c++draft/class.conv.fct#nt:conversion-type-id) is looked up in the same fashion as the [conversion-function-id](https://eel.is/c++draft/class.conv.fct#nt:conversion-function-id) in which it appears[.](https://eel.is/c++draft/basic.lookup#unqual-5.sentence-1) If that lookup finds nothing, it undergoes unqualified name lookup; in each case, only names that denote types or templates whose specializations are types are considered[.](https://eel.is/c++draft/basic.lookup#unqual-5.sentence-2) Per resolution of [CWG1111](https://cplusplus.github.io/CWG/issues/1111.html), additional lookup in the context of the entire postfix-expression, which originally was intended to cross-check lookup in the context of object-expression, was effectively turned into a fallback for it. Check out "Calling a conversion function" example in [P1787R6](https://wg21.link/p1787r6) for step-by-step explanation of the current lookup mechanics for conversion functions. Clang rejects one of the well-formed examples, hence partial status. Clang is the only implementation which rejects it: https://godbolt.org/z/ohhbx8Mfs --- clang/test/CXX/drs/cwg11xx.cpp | 44 +++++++++++++++++++++++++++++++++- clang/test/CXX/drs/cwg1xx.cpp | 1 + clang/www/cxx_dr_status.html | 4 ++-- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/clang/test/CXX/drs/cwg11xx.cpp b/clang/test/CXX/drs/cwg11xx.cpp index 8d187041400a60..d33ff060d2d39e 100644 --- a/clang/test/CXX/drs/cwg11xx.cpp +++ b/clang/test/CXX/drs/cwg11xx.cpp @@ -19,7 +19,7 @@ decltype(return_T>())* b; #endif } // namespace cwg1110 -namespace cwg1111 { // cwg1111: 3.2 +namespace cwg1111 { // cwg1111: partial namespace example1 { template struct set; // #cwg1111-struct-set @@ -57,6 +57,48 @@ void baz() { a.operator A(); } } // namespace example2 + +namespace example3 { +struct A { + operator int(); +} a; +void foo() { + typedef int T; + a.operator T(); // T is found using unqualified lookup + // after qualified lookup in A fails. +} +} // namespace example3 + +namespace example4 { +struct A { + typedef int T; // #cwg1111-A-T + operator T(); +}; +struct B : A { + operator T(); +} b; +void foo() { + b.A::operator T(); // FIXME: qualified lookup should find T in A. + // expected-error@-1 {{unknown type name 'T'}} + // expected-note@#cwg1111-A-T {{'A::T' declared here}} +} +} // namespace example4 + +namespace example5 { +template struct A { + operator T1(); +}; +template struct B : A { + operator T2(); + void foo() { + // In both cases, during instantiation, qualified lookup for T2 wouldn't be able + // to find anything, so T2 has to be found by unqualified lookup. + // After that, 'operator T2()' is found in A by qualfied lookup. + T2 a = A::operator T2(); + T2 b = ((A *)this)->operator T2(); + } +}; +} // namespace example5 } // namespace cwg1111 namespace cwg1113 { // cwg1113: partial diff --git a/clang/test/CXX/drs/cwg1xx.cpp b/clang/test/CXX/drs/cwg1xx.cpp index 9eeca4cb2a681a..e8fe3fff43a575 100644 --- a/clang/test/CXX/drs/cwg1xx.cpp +++ b/clang/test/CXX/drs/cwg1xx.cpp @@ -922,6 +922,7 @@ namespace cwg155 { // cwg155: dup 632 // expected-warning@-1 {{braces around scalar initializer}} } +// cwg156: sup 1111 // cwg158 is in cwg158.cpp namespace cwg159 { // cwg159: 3.5 diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index d767d2973b57ef..6ed5e3d37bae79 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -981,7 +981,7 @@

C++ defect report implementation status

156 NAD Name lookup for conversion functions - Unknown + Superseded by 1111 157 @@ -6485,7 +6485,7 @@

C++ defect report implementation status

1111 C++11 Remove dual-scope lookup of member template names - Clang 3.2 + Partial 1112