================
@@ -1,13 +1,45 @@
// RUN: %clang_cc1 -std=c++98 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,cxx98 %s
// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11 %s
// RUN: %clang_cc1 -std=c++14 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11 %s
-// RUN: %clang_cc1 -std=c++17 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11 %s
-// RUN: %clang_cc1 -std=c++20 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11,since-cxx20 %s
-// RUN: %clang_cc1 -std=c++23 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11,since-cxx20,since-cxx23 %s
-// RUN: %clang_cc1 -std=c++2c -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives
-verify=expected,since-cxx11,since-cxx20,since-cxx23,since-cxx26 %s
+// RUN: %clang_cc1 -std=c++17 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11,since-cxx17 %s
+// RUN: %clang_cc1 -std=c++20 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives -verify=expected,since-cxx11,since-cxx17,since-cxx20 %s
+// RUN: %clang_cc1 -std=c++23 -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives
-verify=expected,since-cxx11,since-cxx17,since-cxx20,since-cxx23 %s
+// RUN: %clang_cc1 -std=c++2c -fexceptions -fcxx-exceptions -pedantic-errors
-verify-directives
-verify=expected,since-cxx11,since-cxx17,since-cxx20,since-cxx23,since-cxx26 %s
// cxx98-no-diagnostics
+namespace cwg2900 { // cwg2900: 24
+#if __cplusplus >= 201703L
+// [temp.deduct.type] Example 13.
+template <int &> struct E;
+template <auto x> void f(E<x> *); // #cwg2900-f-E
+int v;
+void g(E<v> *bp) {
+ f(bp);
+ // since-cxx17-error@-1 {{no matching function for call to 'f'}}
+ // since-cxx17-note@#cwg2900-f-E {{candidate template ignored:
substitution failure: non-type template argument is not a constant expression}}
+}
+
+template <const int &> struct F;
+template <decltype(auto) x> void f(F<x> *);
+int i;
+void g(F<i> *ap) {
+ f(ap); // OK, deduces x as a constant template parameter of type const int &
----------------
Endilll wrote:
For my education, can you explain what `decltype(auto)` does that makes this
example well-formed, compared to the previous ill-formed example?
https://github.com/llvm/llvm-project/pull/224291
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits