[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