[clang] [clang] Add test for CWG110 "Can template functions and classes be declared in the same scope?" (PR #111446)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 7 15:00:59 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Vlad Serebrennikov (Endilll)
<details>
<summary>Changes</summary>
[P1787R6](https://wg21.link/p1787r6):
> [CWG110](https://cplusplus.github.io/CWG/issues/110.html) is resolved by reducing the restriction in [temp.pre] to a note (matching the behavior of GCC, Clang, and ICC).
Wording: see changes to [temp.pre]/7
I believe the wording for the questions raised in the issue is now the definition of corresponding declarations that is given in [[basic.scope.scope]/4](https://eel.is/c++draft/basic.scope#scope-4):
> Two declarations correspond if they (re)introduce the same name, both declare constructors, or both declare destructors, unless
> — either is a using-declarator, or
> — one declares a type (not a typedef-name) and the other declares a variable, non-static data member other than of an anonymous union ([class.union.anon]), enumerator, function, or function template, or
> — each declares a function or function template and they do not declare corresponding overloads.
Then it's used as an input for the definition of potentially conflicting declarations given in [[basic.scope.scope]/6](https://eel.is/c++draft/basic.scope#scope-6).
Answering the question in the title: yes, having a function template and a type with the same name that has the same target scope is well-formed.
A keen eye might spot that the current [[temp.pre]/7](https://eel.is/c++draft/temp.pre#<!-- -->7) note doesn't reflect all of the exception from corresponding declarations definitions in [basic.scope.scope]/4, namely 4.1 and 4.2. I believe the note is defective, and opened an editorial PR against the draft to fix that: https://github.com/cplusplus/draft/pull/7284.
---
Full diff: https://github.com/llvm/llvm-project/pull/111446.diff
2 Files Affected:
- (modified) clang/test/CXX/drs/cwg1xx.cpp (+10)
- (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 d6ee0844458b1d..39423eefc1873f 100644
--- a/clang/test/CXX/drs/cwg1xx.cpp
+++ b/clang/test/CXX/drs/cwg1xx.cpp
@@ -119,6 +119,16 @@ namespace cwg109 { // cwg109: yes
};
}
+namespace cwg110 { // cwg110: 2.8
+template <typename>
+void f();
+
+class f;
+
+template <typename>
+void f(int);
+} // namespace cwg110
+
namespace cwg111 { // cwg111: dup 535
struct A { A(); A(volatile A&, int = 0); A(A&, const char * = "foo"); };
struct B : A { B(); }; // #cwg111-B
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index ba63106ccc3875..1a67b6103cf43e 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -705,7 +705,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/110.html">110</a></td>
<td>CD6</td>
<td>Can template functions and classes be declared in the same scope?</td>
- <td class="unknown" align="center">Unknown</td>
+ <td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="111">
<td><a href="https://cplusplus.github.io/CWG/issues/111.html">111</a></td>
``````````
</details>
https://github.com/llvm/llvm-project/pull/111446
More information about the cfe-commits
mailing list