llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Vlad Serebrennikov (Endilll) <details> <summary>Changes</summary> This is the first of two patches that apply various fixes to C++ DR tests based on new tooling I developed. This patch is almost entirely about incomplete diagnostic text in `expected` directives, which was intended to be complete, but I failed to notice that during reviews. There is also a couple of fixes for `expected-note` directives that were not correctly indented relative to the error they attach to. Then there is couple of fixes when `expected` directives where not placed correctly (didn't use `@-1` way). --- Patch is 37.14 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/179674.diff 20 Files Affected: - (modified) clang/test/CXX/drs/cwg0xx.cpp (+13-13) - (modified) clang/test/CXX/drs/cwg11xx.cpp (+2-2) - (modified) clang/test/CXX/drs/cwg13xx.cpp (+2-2) - (modified) clang/test/CXX/drs/cwg14xx.cpp (+8-8) - (modified) clang/test/CXX/drs/cwg16xx.cpp (+4-4) - (modified) clang/test/CXX/drs/cwg18xx.cpp (+1-1) - (modified) clang/test/CXX/drs/cwg19xx.cpp (+1-1) - (modified) clang/test/CXX/drs/cwg1xx.cpp (+2-2) - (modified) clang/test/CXX/drs/cwg20xx.cpp (+6-6) - (modified) clang/test/CXX/drs/cwg22xx.cpp (+1-1) - (modified) clang/test/CXX/drs/cwg23xx.cpp (+1-1) - (modified) clang/test/CXX/drs/cwg26xx.cpp (+6-6) - (modified) clang/test/CXX/drs/cwg27xx.cpp (+6-6) - (modified) clang/test/CXX/drs/cwg29xx.cpp (+4-2) - (modified) clang/test/CXX/drs/cwg30xx.cpp (+2-2) - (modified) clang/test/CXX/drs/cwg3xx.cpp (+12-12) - (modified) clang/test/CXX/drs/cwg4xx.cpp (+9-9) - (modified) clang/test/CXX/drs/cwg5xx.cpp (+7-7) - (modified) clang/test/CXX/drs/cwg6xx.cpp (+7-7) - (modified) clang/test/CXX/drs/cwg7xx.cpp (+2-2) ``````````diff diff --git a/clang/test/CXX/drs/cwg0xx.cpp b/clang/test/CXX/drs/cwg0xx.cpp index 10a4f1d6add3a..6d3a3238d4f38 100644 --- a/clang/test/CXX/drs/cwg0xx.cpp +++ b/clang/test/CXX/drs/cwg0xx.cpp @@ -335,14 +335,14 @@ namespace cwg25 { // cwg25: 4 // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} void (A::*g)() throw () = f; // cxx98-14-error@-1 {{target exception specification is not superset of source}} - // since-cxx17-error@-2 {{different exception specifications}} + // since-cxx17-error@-2 {{cannot initialize a variable of type 'void (A::*)() throw()' with an lvalue of type 'void (A::*)() throw(int)': different exception specifications}} void (A::*g2)() throw () = 0; void (A::*h)() throw (int, char) = f; // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} void (A::*i)() throw () = &A::f; // cxx98-14-error@-1 {{target exception specification is not superset of source}} - // since-cxx17-error@-2 {{different exception specifications}} + // since-cxx17-error@-2 {{cannot initialize a variable of type 'void (A::*)() throw()' with an rvalue of type 'void (A::*)() throw(int)': different exception specifications}} void (A::*i2)() throw () = 0; void (A::*j)() throw (int, char) = &A::f; // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} @@ -350,11 +350,11 @@ namespace cwg25 { // cwg25: 4 void x() { g2 = f; // cxx98-14-error@-1 {{target exception specification is not superset of source}} - // since-cxx17-error@-2 {{different exception specifications}} + // since-cxx17-error@-2 {{assigning to 'void (A::*)() throw()' from incompatible type 'void (A::*)() throw(int)': different exception specifications}} h = f; i2 = &A::f; // cxx98-14-error@-1 {{target exception specification is not superset of source}} - // since-cxx17-error@-2 {{different exception specifications}} + // since-cxx17-error@-2 {{assigning to 'void (A::*)() throw()' from incompatible type 'void (A::*)() throw(int)': different exception specifications}} j = &A::f; } } // namespace cwg25 @@ -708,7 +708,7 @@ namespace cwg39 { // cwg39: no struct cwg39::PR5916::D -> C -> A}} */ // expected-note@#cwg39-A-n {{member found by ambiguous name lookup}} - // expected-error@#cwg39-sizeof {{unknown type name}} + // expected-error@#cwg39-sizeof {{unknown type name 'n'}} #if __cplusplus >= 201103L decltype(D::n) n; /* since-cxx11-error@-1 @@ -1058,19 +1058,19 @@ namespace cwg62 { // cwg62: 2.9 void f() { struct NoLinkage {}; X<NoLinkage> a; - // cxx98-error@-1 {{template argument uses local type }} + // cxx98-error@-1 {{template argument uses local type 'NoLinkage'}} X<const NoLinkage> b; - // cxx98-error@-1 {{template argument uses local type }} + // cxx98-error@-1 {{template argument uses local type 'NoLinkage'}} get<NoLinkage>(); - // cxx98-error@-1 {{template argument uses local type }} - // cxx98-note@-2 {{while substituting explicitly-specified template arguments}} + // cxx98-error@-1 {{template argument uses local type 'NoLinkage'}} + // cxx98-note@-2 {{while substituting explicitly-specified template arguments into function template 'get'}} get<const NoLinkage>(); - // cxx98-error@-1 {{template argument uses local type }} - // cxx98-note@-2 {{while substituting explicitly-specified template arguments}} + // cxx98-error@-1 {{template argument uses local type 'NoLinkage'}} + // cxx98-note@-2 {{while substituting explicitly-specified template arguments into function template 'get'}} X<void (*)(NoLinkage A::*)> c; - // cxx98-error@-1 {{template argument uses local type }} + // cxx98-error@-1 {{template argument uses local type 'NoLinkage'}} X<int NoLinkage::*> d; - // cxx98-error@-1 {{template argument uses local type }} + // cxx98-error@-1 {{template argument uses local type 'NoLinkage'}} } } // namespace cwg62 diff --git a/clang/test/CXX/drs/cwg11xx.cpp b/clang/test/CXX/drs/cwg11xx.cpp index 03612b6d87645..fc24deaf7cbcc 100644 --- a/clang/test/CXX/drs/cwg11xx.cpp +++ b/clang/test/CXX/drs/cwg11xx.cpp @@ -81,7 +81,7 @@ struct B : A { } b; void foo() { b.A::operator T(); // FIXME: qualified lookup should find T in A. - // expected-error@-1 {{unknown type name 'T'}} + // expected-error@-1 {{unknown type name 'T'; did you mean 'A::T'?}} // expected-note@#cwg1111-A-T {{'A::T' declared here}} } } // namespace example4 @@ -107,7 +107,7 @@ namespace cwg1113 { // cwg1113: partial namespace named { extern int a; // #cwg1113-a static int a; - // expected-error@-1 {{static declaration of 'a' follows non-static}} + // expected-error@-1 {{static declaration of 'a' follows non-static declaration}} // expected-note@#cwg1113-a {{previous declaration is here}} } namespace { diff --git a/clang/test/CXX/drs/cwg13xx.cpp b/clang/test/CXX/drs/cwg13xx.cpp index ad6ee01483b4a..0f97c484becdb 100644 --- a/clang/test/CXX/drs/cwg13xx.cpp +++ b/clang/test/CXX/drs/cwg13xx.cpp @@ -528,11 +528,11 @@ namespace cwg1359 { // cwg1359: 3.5 union B { constexpr B() = default; int a; }; // #cwg1359-B // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr before C++23}} union C { constexpr C() = default; int a, b; }; // #cwg1359-C - // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr}} + // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr before C++23}} struct X { constexpr X() = default; union {}; }; // since-cxx11-error@-1 {{declaration does not declare anything}} struct Y { constexpr Y() = default; union { int a; }; }; // #cwg1359-Y - // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr}} + // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr before C++23}} constexpr A a = A(); constexpr B b = B(); diff --git a/clang/test/CXX/drs/cwg14xx.cpp b/clang/test/CXX/drs/cwg14xx.cpp index 047df171afffa..dba1850ce8df9 100644 --- a/clang/test/CXX/drs/cwg14xx.cpp +++ b/clang/test/CXX/drs/cwg14xx.cpp @@ -31,20 +31,20 @@ namespace cwg1413 { // cwg1413: 12 // ok, variable declaration Check<true ? 0 : a>::type *var2; // #cwg1413-var2 Check<true ? 0 : b>::type *var3; - // expected-error@-1 {{use of undeclared identifier 'var3'}} + // expected-error@-1 {{use of undeclared identifier 'var3'; did you mean 'var2'?}} // expected-note@#cwg1413-var2 {{'var2' declared here}} Check<true ? 0 : ((void)c, 0)>::type *var4; - // expected-error@-1 {{use of undeclared identifier 'var4'}} + // expected-error@-1 {{use of undeclared identifier 'var4'; did you mean 'var2'?}} // expected-note@#cwg1413-var2 {{'var2' declared here}} // value-dependent because of the implied type-dependent 'this->', not because of 'd' Check<true ? 0 : (d(), 0)>::type *var5; - // expected-error@-1 {{use of undeclared identifier 'var5'}} + // expected-error@-1 {{use of undeclared identifier 'var5'; did you mean 'var2'?}} // expected-note@#cwg1413-var2 {{'var2' declared here}} // value-dependent because of the value-dependent '&' operator, not because of 'A::d' Check<true ? 0 : (&A::d(), 0)>::type *var5; - // expected-error@-1 {{use of undeclared identifier 'var5'}} + // expected-error@-1 {{use of undeclared identifier 'var5'; did you mean 'var2'?}} // expected-note@#cwg1413-var2 {{'var2' declared here}} } }; @@ -116,7 +116,7 @@ void f() { // since-cxx11-error@-1 {{cannot initialize a variable of type 'const int' with an rvalue of type 'A *'}} constexpr A *p2 = &*a; // since-cxx11-error@-1 {{constexpr variable 'p2' must be initialized by a constant expression}} - // since-cxx11-note@-2 {{dereferencing a null pointer}} + // since-cxx11-note@-2 {{dereferencing a null pointer is not allowed in a constant expression}} } struct A { @@ -192,16 +192,16 @@ namespace cwg1460 { // cwg1460: 3.5 namespace Defaulted { union A { constexpr A() = default; }; union B { int n; constexpr B() = default; }; - // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr}} + // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr before C++23}} union C { int n = 0; constexpr C() = default; }; struct D { union {}; constexpr D() = default; }; // since-cxx11-error@-1 {{declaration does not declare anything}} struct E { union { int n; }; constexpr E() = default; }; - // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr}} + // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr before C++23}} struct F { union { int n = 0; }; constexpr F() = default; }; struct G { union { int n = 0; }; union { int m; }; constexpr G() = default; }; - // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr}} + // cxx11-17-error@-1 {{defaulted definition of default constructor cannot be marked constexpr before C++23}} struct H { union { int n = 0; diff --git a/clang/test/CXX/drs/cwg16xx.cpp b/clang/test/CXX/drs/cwg16xx.cpp index bd2c484344ddf..1a36aba859e50 100644 --- a/clang/test/CXX/drs/cwg16xx.cpp +++ b/clang/test/CXX/drs/cwg16xx.cpp @@ -162,10 +162,10 @@ namespace cwg1653 { // cwg1653: 4 c++17 void f(bool b) { ++b; // cxx98-14-warning@-1 {{incrementing expression of type bool is deprecated and incompatible with C++17}} - // since-cxx17-error@-2 {{SO C++17 does not allow incrementing expression of type bool}} + // since-cxx17-error@-2 {{ISO C++17 does not allow incrementing expression of type bool}} b++; // cxx98-14-warning@-1 {{incrementing expression of type bool is deprecated and incompatible with C++17}} - // since-cxx17-error@-2 {{SO C++17 does not allow incrementing expression of type bool}} + // since-cxx17-error@-2 {{ISO C++17 does not allow incrementing expression of type bool}} --b; // expected-error@-1 {{cannot decrement expression of type bool}} b--; @@ -453,7 +453,7 @@ namespace cwg1696 { // cwg1696: 7 struct A1 { A1() : v(42) {} // since-cxx14-error@-1 {{reference member 'v' binds to a temporary object whose lifetime would be shorter than the lifetime of the constructed object}} - // since-cxx14-note@#cwg1696-A1 {{reference member declared here}} + // since-cxx14-note@#cwg1696-A1 {{reference member declared here}} const int &v; // #cwg1696-A1 }; @@ -551,7 +551,7 @@ namespace cwg1696 { // cwg1696: 7 std::initializer_list<int> il = {1, 2, 3}; // #cwg1696-il-5 haslist5() {} // since-cxx11-error@-1 {{backing array for 'std::initializer_list' member 'il' is a temporary object whose lifetime would be shorter than the lifetime of the constructed object}} - // since-cxx11-note@#cwg1696-il-5 {{nitializing field 'il' with default member initializer}} + // since-cxx11-note@#cwg1696-il-5 {{initializing field 'il' with default member initializer}} }; #endif } // namespace cwg1696 diff --git a/clang/test/CXX/drs/cwg18xx.cpp b/clang/test/CXX/drs/cwg18xx.cpp index 9948075852135..c0363fa467ea1 100644 --- a/clang/test/CXX/drs/cwg18xx.cpp +++ b/clang/test/CXX/drs/cwg18xx.cpp @@ -568,7 +568,7 @@ struct Bar { int a = 0; }; static_assert(__is_constructible(Baz), ""); - // since-cxx11-error@-1 {{static assertion failed due to requirement '__is_constructible(cwg1890::ex2::Bar::Baz)'}} + // since-cxx11-error@-1 {{static assertion failed due to requirement '__is_constructible(cwg1890::ex2::Bar::Baz)':}} // since-cxx11-note@#cwg1890-Baz {{'Baz' defined here}} }; #endif diff --git a/clang/test/CXX/drs/cwg19xx.cpp b/clang/test/CXX/drs/cwg19xx.cpp index 15ad3921cb1be..8bec8db734d78 100644 --- a/clang/test/CXX/drs/cwg19xx.cpp +++ b/clang/test/CXX/drs/cwg19xx.cpp @@ -123,7 +123,7 @@ namespace cwg1940 { // cwg1940: 3.5 static union { static_assert(true, ""); // ok static_assert(false, ""); - // since-cxx11-error@-1 {{static assertion failed}} + // since-cxx11-error@-1 {{static assertion failed:}} int not_empty; }; #endif diff --git a/clang/test/CXX/drs/cwg1xx.cpp b/clang/test/CXX/drs/cwg1xx.cpp index c9dce77b772dc..066a429ea1c59 100644 --- a/clang/test/CXX/drs/cwg1xx.cpp +++ b/clang/test/CXX/drs/cwg1xx.cpp @@ -910,7 +910,7 @@ namespace cwg152 { // cwg152: 2.7 namespace cwg154 { // cwg154: 2.7 union { int a; }; - // expected-error@-1 {{nonymous unions at namespace or global scope must be declared 'static'}} + // expected-error@-1 {{anonymous unions at namespace or global scope must be declared 'static'}} namespace { union { int b; }; } @@ -960,7 +960,7 @@ namespace cwg161 { // cwg161: 3.1 f(); sf(); c.f(); - // expected-error@-1 {{protected}} + // expected-error@-1 {{'f' is a protected member of 'cwg161::A'}} // expected-note@#cwg161-f {{declared protected here}} c.sf(); A::f(); diff --git a/clang/test/CXX/drs/cwg20xx.cpp b/clang/test/CXX/drs/cwg20xx.cpp index bd233bb09522f..339d4d83c47e9 100644 --- a/clang/test/CXX/drs/cwg20xx.cpp +++ b/clang/test/CXX/drs/cwg20xx.cpp @@ -160,16 +160,16 @@ namespace cwg2076 { // cwg2076: 13 foo({arg}); foo({{arg}}); foo({{{arg}}}); - // since-cxx11-error@-1 {{no matching function}} - // since-cxx11-note@#cwg2076-foo {{cannot convert initializer list}} + // since-cxx11-error@-1 {{no matching function for call to 'foo'}} + // since-cxx11-note@#cwg2076-foo {{candidate function not viable: cannot convert initializer list argument to 'const string'}} bar(arg); bar({arg}); bar({{arg}}); - // since-cxx11-error@-1 {{no matching function}} - // since-cxx11-note@#cwg2076-bar {{cannot convert initializer list}} + // since-cxx11-error@-1 {{no matching function for call to 'bar'}} + // since-cxx11-note@#cwg2076-bar {{candidate function not viable: cannot convert initializer list argument to 'string_view'}} bar({{{arg}}}); - // since-cxx11-error@-1 {{no matching function}} - // since-cxx11-note@#cwg2076-bar {{cannot convert initializer list}} + // since-cxx11-error@-1 {{no matching function for call to 'bar'}} + // since-cxx11-note@#cwg2076-bar {{candidate function not viable: cannot convert initializer list argument to 'string_view'}} } #endif } // namespace cwg2076 diff --git a/clang/test/CXX/drs/cwg22xx.cpp b/clang/test/CXX/drs/cwg22xx.cpp index 34119a162623e..5585602a2894e 100644 --- a/clang/test/CXX/drs/cwg22xx.cpp +++ b/clang/test/CXX/drs/cwg22xx.cpp @@ -108,7 +108,7 @@ namespace MultilevelSpecialization { template<> template<int a, int b> void B<int, int>::f(int i, int (&arr1)[a], int (&arr2)[b]) {} // since-cxx11-error@-1 {{out-of-line definition of 'f' does not match any declaration in 'cwg2233::MultilevelSpecialization::B<int, int>'}} - // since-cxx11-note@#cwg2233-B {{defined here}} + // since-cxx11-note@#cwg2233-B {{B defined here}} template<> template<> void B<int, int>::f<1, 1>(int i, int (&arr1a)[1], int (&arr2a)[1]) {} } diff --git a/clang/test/CXX/drs/cwg23xx.cpp b/clang/test/CXX/drs/cwg23xx.cpp index 72cf249f8b53d..ae52df2e9b8ea 100644 --- a/clang/test/CXX/drs/cwg23xx.cpp +++ b/clang/test/CXX/drs/cwg23xx.cpp @@ -270,7 +270,7 @@ namespace cwg2352 { // cwg2352: 10 // lvalue of type 'const int *const * const'? const int * const * r; void *y = &(true ? p : r); - // expected-error@-1 {{rvalue of type 'const int *const *'}} + // expected-error@-1 {{cannot take the address of an rvalue of type 'const int *const *'}} // FIXME: We order these as a speculative defect resolution. void f(const int * const * const &r); diff --git a/clang/test/CXX/drs/cwg26xx.cpp b/clang/test/CXX/drs/cwg26xx.cpp index aa87f5a1857c6..bfa785d75f06b 100644 --- a/clang/test/CXX/drs/cwg26xx.cpp +++ b/clang/test/CXX/drs/cwg26xx.cpp @@ -142,8 +142,8 @@ struct foo { void f() { foo fooable; // #cwg2628-fooable - // since-cxx20-error@#cwg2628-fooable {{call to deleted}} - // since-cxx20-note@#cwg2628-ctor {{marked deleted here}} + // since-cxx20-error@#cwg2628-fooable {{call to deleted constructor of 'foo<>' (aka 'cwg2628::foo<>')}} + // since-cxx20-note@#cwg2628-ctor {{'foo' has been explicitly marked deleted here}} } #endif } // namespace cwg2628 @@ -244,7 +244,7 @@ class X { }; int i0 = f<X>(0); // since-cxx23-error@-1 {{no matching function for call to 'f'}} -// since-cxx23-note@#cwg2650-f {{type 'X' of non-type template parameter is not a structural type}} +// since-cxx23-note@#cwg2650-f {{candidate template ignored: substitution failure [with T = X]: type 'X' of non-type template parameter is not a structural type}} #endif } // namespace cwg2650 @@ -290,7 +290,7 @@ static_assert(__is_same(decltype(h), H<char, 4>)); // Not H<const char, 4> static_assert(__is_same(decltype(i), I<char, 4>)); J j = { "ghi" }; -// since-cxx20-error@-1 {{no viable constructor or deduction guide}} +// since-cxx20-error@-1 {{no viable constructor or deduction guide for deduction of template arguments of 'J'}} // since-cxx20-note@#cwg2681-J {{candidate template ignored: could not match 'cwg2681::J<N>' against 'const char *'}} // since-cxx20-note@#cwg2681-J {{implicit deduction guide declared as 'template <size_t N> J(cwg2681::J<N>) -> cwg2681::J<N>'}} // since-cxx20-note@#cwg2681-J {{candidate template ignored: could not match 'const unsigned char' against 'const char'}} @@ -370,8 +370,8 @@ void A::test() { (&A::g)(A()); // since-cxx23-error@-1 {{call to 'g' is ambiguous}} - // since-cxx23-note@#cwg2692-3 {{candidate function}} - // since-cxx23-note@#cwg2692-4 {{candidate function}} + // since-cxx23-note@#cwg2692-3 {{candidate function [with T = cwg2692::A]}} + // since-cxx23-note@#cwg2692-4 {{candidate function [with T = cwg2692::A]}} (&A::g<A>)(); // since-cxx23-error@-1 {{no matching function for call to 'g'}} // since-cxx23-note@#cwg2692-3 {{candidate function template not viable: requires 1 argument, but 0 were provided}} diff --git a/clang/test/CXX/drs/cwg27xx.cpp b/clang/test/CXX/drs/cwg27xx.cpp index 7caf36a9f23b2..934646ae837e6 100644 --- a/clang/test/CXX/drs/cwg27xx.cpp +++ b/clang/test/CXX/drs/cwg27xx.cpp @@ -46,13 +46,13 @@ A(T...) -> A<int, sizeof...(T)> requires (sizeof...(T) == 2); // #cwg2707-guide- A a = {1, 2}; A b = {3, 4, 5}; -// since-cxx20-error@-1 {{no viable constructor or deduction guide}} -// since-cxx20-note@#cwg2707-A {{candidate function template not viable}} -// since-cxx20-note@#cwg2707-A {{implicit deduction guide}} -// since-cxx20-note@#cwg2707-guide-A {{constraints not satisfied}} +// since-cxx20-error@-1 {{no viable constructor or deduction guide for deduction of template arguments of 'A'}} +// since-cxx20-note@#cwg2707-A {{candidate function template not viable: requires 1 argument, but 3 were provided}} +// since-cxx20-note@#cwg2707-A {{implicit deduction guide declared as 'template <class T, unsigned int N> A(cwg2707::A<T, N>) -> cwg2707::A<T, N>'}} +// since-cxx20-note@#cwg2707-guide-A {{candidate template ignored: constraints not satisfied [with T = <int, int, int>]}} // since-cxx20-note@#cwg2707-guide-A {{because 'sizeof...(T) == 2' (3 == 2) evaluated to false}} -// since-cxx20-note@#cwg2707-A {{candidate function template not viable}} -// since-cxx20-note@#cwg2707-A {{implicit deduction guide}} +// since-cxx20-note@#cwg2707-A {{candidate function template not viable: requires 0 arguments, but 3 were provided}} +// since-cxx20-note@#cwg2707-A {{implicit deduction guide declared as 'template <class T, unsigned int N> A() -> cwg2707::A<T, N>'}} #endif diff --git a/clang/test/CXX/drs/cwg29xx.cpp b/clang/test/CXX/drs/cwg29xx.cpp index f9c2e9ecf4618..7b0cc878f5bc8 100644 --- a/clang/test/CXX/drs/cwg29xx.cpp +++ b/clang/test/CXX/drs/cwg29xx.cpp @@ -74,8 +74,10 @@ template<bool B> struct X { }; void test() { - &X<true>::f; // since-cxx20-error {{refere... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/179674 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
