[clang] 1dfdbf7 - [clang] Add covariance tests that make sure we return an error when return value is different in pointer / lvalue ref / rvalue ref (#112853)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 21 07:05:30 PDT 2024
Author: Boaz Brickner
Date: 2024-10-21T16:05:24+02:00
New Revision: 1dfdbf716112627dea5e79f7f4f1e1e9335ee9df
URL: https://github.com/llvm/llvm-project/commit/1dfdbf716112627dea5e79f7f4f1e1e9335ee9df
DIFF: https://github.com/llvm/llvm-project/commit/1dfdbf716112627dea5e79f7f4f1e1e9335ee9df.diff
LOG: [clang] Add covariance tests that make sure we return an error when return value is different in pointer / lvalue ref / rvalue ref (#112853)
Per https://cplusplus.github.io/CWG/issues/960.html.
Added:
Modified:
clang/test/CXX/drs/cwg9xx.cpp
clang/www/cxx_dr_status.html
Removed:
################################################################################
diff --git a/clang/test/CXX/drs/cwg9xx.cpp b/clang/test/CXX/drs/cwg9xx.cpp
index 2700b0f5662a2c..d4f54bcdad6ea0 100644
--- a/clang/test/CXX/drs/cwg9xx.cpp
+++ b/clang/test/CXX/drs/cwg9xx.cpp
@@ -93,6 +93,56 @@ struct B : A {
} // namespace example2
} // namespace cwg952
+namespace cwg960 { // cwg960: 3.0
+struct a {};
+class A {
+#if __cplusplus >= 201103L
+ // Check lvalue ref vs rvalue ref vs pointer.
+ virtual a& rvalue_ref();
+ virtual a&& lvalue_ref();
+ virtual a& rvalue_vs_lvalue_ref(); // #cwg960-A-rvalue_vs_lvalue_ref
+ virtual a&& lvalue_vs_rvalue_ref(); // #cwg960-A-lvalue_vs_rvalue_ref
+ virtual a& rvalue_ref_vs_pointer(); // #cwg960-A-rvalue_ref_vs_pointer
+ virtual a* pointer_vs_rvalue_ref(); // #cwg960-A-pointer_vs_rvalue_ref
+ virtual a&& lvalue_ref_vs_pointer(); // #cwg960-A-lvalue_ref_vs_pointer
+ virtual a* pointer_vs_lvalue_ref(); // #cwg960-A-pointer_vs_lvalue_ref
+#endif
+};
+
+class B : A {
+#if __cplusplus >= 201103L
+ // Check lvalue ref vs rvalue ref vs pointer.
+ a& rvalue_ref() override;
+ a&& lvalue_ref() override;
+
+ a&& rvalue_vs_lvalue_ref() override;
+ // since-cxx11-error at -1 {{virtual function 'rvalue_vs_lvalue_ref' has a
diff erent return type ('a &&') than the function it overrides (which has return type 'a &')}}
+ // since-cxx11-note@#cwg960-A-rvalue_vs_lvalue_ref {{overridden virtual function is here}}
+
+ a& lvalue_vs_rvalue_ref() override;
+ // since-cxx11-error at -1 {{virtual function 'lvalue_vs_rvalue_ref' has a
diff erent return type ('a &') than the function it overrides (which has return type 'a &&')}}
+ // since-cxx11-note@#cwg960-A-lvalue_vs_rvalue_ref {{overridden virtual function is here}}
+
+ a* rvalue_ref_vs_pointer() override;
+ // since-cxx11-error at -1 {{virtual function 'rvalue_ref_vs_pointer' has a
diff erent return type ('a *') than the function it overrides (which has return type 'a &')}}
+ // since-cxx11-note@#cwg960-A-rvalue_ref_vs_pointer {{overridden virtual function is here}}
+
+ a& pointer_vs_rvalue_ref() override;
+ // since-cxx11-error at -1 {{virtual function 'pointer_vs_rvalue_ref' has a
diff erent return type ('a &') than the function it overrides (which has return type 'a *')}}
+ // since-cxx11-note@#cwg960-A-pointer_vs_rvalue_ref {{overridden virtual function is here}}
+
+ a* lvalue_ref_vs_pointer() override;
+ // since-cxx11-error at -1 {{virtual function 'lvalue_ref_vs_pointer' has a
diff erent return type ('a *') than the function it overrides (which has return type 'a &&')}}
+ // since-cxx11-note@#cwg960-A-lvalue_ref_vs_pointer {{overridden virtual function is here}}
+
+ a&& pointer_vs_lvalue_ref() override;
+ // since-cxx11-error at -1 {{virtual function 'pointer_vs_lvalue_ref' has a
diff erent return type ('a &&') than the function it overrides (which has return type 'a *')}}
+ // since-cxx11-note@#cwg960-A-pointer_vs_lvalue_ref {{overridden virtual function is here}}
+#endif
+};
+
+} // namespace cwg960
+
namespace cwg974 { // cwg974: yes
#if __cplusplus >= 201103L
void test() {
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 6f3cc8247d2e2d..714fb5c14aff68 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -5579,7 +5579,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/960.html">960</a></td>
<td>CD2</td>
<td>Covariant functions and lvalue/rvalue references</td>
- <td class="unknown" align="center">Unknown</td>
+ <td class="full" align="center">Clang 3.0</td>
</tr>
<tr id="961">
<td><a href="https://cplusplus.github.io/CWG/issues/961.html">961</a></td>
More information about the cfe-commits
mailing list