https://github.com/Endilll created 
https://github.com/llvm/llvm-project/pull/121654

This patch adds test for 
[CWG156](https://cplusplus.github.io/CWG/issues/156.html). 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

>From dcd29ca8c77e24c532ca8300a7e46f5498ffebbb Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com>
Date: Sat, 4 Jan 2025 19:37:46 +0300
Subject: [PATCH] [clang] Add test for CWG156 "Name lookup for conversion
 functions"

---
 clang/test/CXX/drs/cwg1xx.cpp | 43 +++++++++++++++++++++++++++++++++++
 clang/www/cxx_dr_status.html  |  2 +-
 2 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/clang/test/CXX/drs/cwg1xx.cpp b/clang/test/CXX/drs/cwg1xx.cpp
index 6aec8b65c91f12..eddad2e6a87b00 100644
--- a/clang/test/CXX/drs/cwg1xx.cpp
+++ b/clang/test/CXX/drs/cwg1xx.cpp
@@ -922,6 +922,49 @@ namespace cwg155 { // cwg155: dup 632
   // expected-warning@-1 {{braces around scalar initializer}}
 }
 
+namespace cwg156 { // cwg156: partial
+namespace ex1 {
+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 ex1
+
+namespace ex2 {
+struct A {
+  typedef int 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'}}
+}
+} // namespace ex2
+
+namespace ex3 {
+template <class T1> struct A {
+  operator T1();
+};
+template <class T2> struct B : A<T2> {
+  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<T2> by qualfied lookup.
+    T2 a = A<T2>::operator T2();
+    T2 b = ((A<T2> *)this)->operator T2();
+  }
+};
+} // namespace ex3
+} // namespace cwg156
+
 // 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 c069e155fd547c..bbdca49aad0533 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -981,7 +981,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/156.html";>156</a></td>
     <td>NAD</td>
     <td>Name lookup for conversion functions</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="partial" align="center">Partial</td>
   </tr>
   <tr class="open" id="157">
     <td><a href="https://cplusplus.github.io/CWG/issues/157.html";>157</a></td>

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to