[clang] [clang] Add test for CWG156 "Name lookup for conversion functions" (PR #121654)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 4 08:54:53 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Vlad Serebrennikov (Endilll)
<details>
<summary>Changes</summary>
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
---
Full diff: https://github.com/llvm/llvm-project/pull/121654.diff
2 Files Affected:
- (modified) clang/test/CXX/drs/cwg1xx.cpp (+43)
- (modified) clang/www/cxx_dr_status.html (+1-1)
``````````diff
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 at -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 at -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>
``````````
</details>
https://github.com/llvm/llvm-project/pull/121654
More information about the cfe-commits
mailing list