cor3ntin updated this revision to Diff 500866. cor3ntin marked an inline comment as done. cor3ntin added a comment.
Address Aaron's comments Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D144285/new/ https://reviews.llvm.org/D144285 Files: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDeclCXX.cpp clang/test/CXX/drs/dr25xx.cpp clang/test/SemaCXX/access-base-class.cpp clang/test/SemaCXX/coroutines-exp-namespace.cpp clang/test/SemaCXX/coroutines.cpp clang/test/SemaCXX/static-assert.cpp clang/test/SemaTemplate/instantiate-var-template.cpp clang/test/SemaTemplate/instantiation-dependence.cpp clang/www/cxx_dr_status.html
Index: clang/www/cxx_dr_status.html =================================================================== --- clang/www/cxx_dr_status.html +++ clang/www/cxx_dr_status.html @@ -14915,7 +14915,7 @@ <td><a href="https://wg21.link/cwg2518">2518</a></td> <td>review</td> <td>Conformance requirements and <TT>#error</TT>/<TT>#warning</TT></td> - <td align="center">Not resolved</td> + <td class="unreleased" align="center">Clang 17</td> </tr> <tr class="open" id="2519"> <td><a href="https://wg21.link/cwg2519">2519</a></td> Index: clang/test/SemaTemplate/instantiation-dependence.cpp =================================================================== --- clang/test/SemaTemplate/instantiation-dependence.cpp +++ clang/test/SemaTemplate/instantiation-dependence.cpp @@ -37,8 +37,8 @@ template<class ...Args> using indirect_void_t = typename indirect_void_t_imp<Args...>::type; template<class T> void foo() { - static_assert(!__is_void(indirect_void_t<T>)); // "ok", dependent - static_assert(!__is_void(void_t<T>)); // expected-error {{failed}} + int check1[__is_void(indirect_void_t<T>) == 0 ? 1 : -1]; // "ok", dependent + int check2[__is_void(void_t<T>) == 0 ? 1 : -1]; // expected-error {{array with a negative size}} } } Index: clang/test/SemaTemplate/instantiate-var-template.cpp =================================================================== --- clang/test/SemaTemplate/instantiate-var-template.cpp +++ clang/test/SemaTemplate/instantiate-var-template.cpp @@ -31,9 +31,9 @@ static_assert(b<char> == 1, ""); // expected-note {{in instantiation of}} template<typename T> void f() { - static_assert(a<sizeof(sizeof(f(T())))> == 0, ""); // expected-error {{static assertion failed due to requirement 'a<sizeof (sizeof (f(type-parameter-0-0())))> == 0'}} \ - // expected-note {{evaluates to '1 == 0'}} + int check[a<sizeof(sizeof(f(T())))> == 0 ? 1 : -1]; // expected-error {{array with a negative size}} } + } namespace PR24483 { Index: clang/test/SemaCXX/static-assert.cpp =================================================================== --- clang/test/SemaCXX/static-assert.cpp +++ clang/test/SemaCXX/static-assert.cpp @@ -52,9 +52,11 @@ template<typename T> struct AlwaysFails { // Only give one error here. - static_assert(false, ""); // expected-error {{static assertion failed}} + static_assert(false, ""); // expected-error 2{{static assertion failed}} }; -AlwaysFails<int> alwaysFails; +AlwaysFails<int> alwaysFails; // expected-note {{instantiation}} +AlwaysFails<double> alwaysFails2; // expected-note {{instantiation}} + template<typename T> struct StaticAssertProtected { static_assert(__is_literal(T), ""); // expected-error {{static assertion failed}} @@ -217,6 +219,23 @@ static_assert(1 , "") // expected-error {{expected ';' after 'static_assert'}} +namespace DependentAlwaysFalse { +template <typename Ty> +struct S { + static_assert(false); // expected-error{{static assertion failed}} \ + // expected-warning {{C++17 extension}} +}; + +template <typename Ty> +struct T { + static_assert(false, "test"); // expected-error{{static assertion failed: test}} +}; + +int f() { + S<double> s; //expected-note {{in instantiation of template class 'DependentAlwaysFalse::S<double>' requested here}} + T<double> t; //expected-note {{in instantiation of template class 'DependentAlwaysFalse::T<double>' requested here}} +} +} namespace Diagnostics { /// No notes for literals. Index: clang/test/SemaCXX/coroutines.cpp =================================================================== --- clang/test/SemaCXX/coroutines.cpp +++ clang/test/SemaCXX/coroutines.cpp @@ -1309,7 +1309,7 @@ } }; -template struct DepTestType<int>; // expected-note {{requested here}} +template struct DepTestType<int>; // expected-note 2{{requested here}} template CoroMemberTag DepTestType<int>::test_member_template(long, const char *) const &&; template CoroMemberTag DepTestType<int>::test_static_template<void>(const char *volatile &, unsigned); Index: clang/test/SemaCXX/coroutines-exp-namespace.cpp =================================================================== --- clang/test/SemaCXX/coroutines-exp-namespace.cpp +++ clang/test/SemaCXX/coroutines-exp-namespace.cpp @@ -1288,7 +1288,7 @@ } }; -template struct DepTestType<int>; // expected-note {{requested here}} +template struct DepTestType<int>; // expected-note 2{{requested here}} template CoroMemberTag DepTestType<int>::test_member_template(long, const char *) const &&; template CoroMemberTag DepTestType<int>::test_static_template<void>(const char *volatile &, unsigned); Index: clang/test/SemaCXX/access-base-class.cpp =================================================================== --- clang/test/SemaCXX/access-base-class.cpp +++ clang/test/SemaCXX/access-base-class.cpp @@ -96,14 +96,14 @@ }; template <class T> -struct trait : flag<sizeof(T)> {}; +struct trait : flag<sizeof(T)> {}; // expected-note 2{{here}} -template <class T, bool Inferred = trait<T>::value> +template <class T, bool Inferred = trait<T>::value> // expected-note {{here}} struct a {}; template <class T> class b { - a<T> x; + a<T> x; // expected-note {{here}} using U = a<T>; }; @@ -113,5 +113,5 @@ }; // verify "no member named 'value'" bogus diagnostic is not emitted. -trait<b<Impossible<0>>>::value; +trait<b<Impossible<0>>>::value; // expected-note {{here}} } // namespace T8 Index: clang/test/CXX/drs/dr25xx.cpp =================================================================== --- clang/test/CXX/drs/dr25xx.cpp +++ clang/test/CXX/drs/dr25xx.cpp @@ -1,5 +1,50 @@ // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify +namespace dr2518 { // dr2518: 17 review + +#error one +// expected-error@-1 {{one}} +#if 0 +#error skip +#warning skip +#endif +#error two +// expected-error@-1 {{two}} +#warning warn +// expected-warning@-1 {{warn}} + +template <class T> +void f(T t) { + if constexpr (sizeof(T) != sizeof(int)) { + static_assert(false, "must be int-sized"); // expected-error {{must be int-size}} + } +} + +void g(char c) { + f(0); + f(c); // expected-note {{requested here}} +} + +template <typename Ty> +struct S { + static_assert(false); // expected-error {{static assertion failed}} +}; + +template <> +struct S<int> {}; + +template <> +struct S<float> {}; + +int test_specialization() { + S<int> s1; + S<float> s2; + S<double> s3; // expected-note {{in instantiation of template class 'dr2518::S<double>' requested here}} +} + +} + + namespace dr2565 { // dr2565: 16 open template<typename T> concept C = requires (typename T::type x) { Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -16799,7 +16799,14 @@ FoldKind).isInvalid()) Failed = true; - if (!Failed && !Cond) { + // CWG2518 + // [dcl.pre]/p10 If [...] the expression is evaluated in the context of a + // template definition, the declaration has no effect. + bool InTemplateDefinition = + getLangOpts().CPlusPlus && CurContext->isDependentContext(); + + if (!Failed && !Cond && !InTemplateDefinition) { + SmallString<256> MsgBuffer; llvm::raw_svector_ostream Msg(MsgBuffer); if (AssertMessage) { @@ -16830,7 +16837,8 @@ DiagnoseStaticAssertDetails(InnerCond); } else { Diag(StaticAssertLoc, diag::err_static_assert_failed) - << !AssertMessage << Msg.str() << AssertExpr->getSourceRange(); + << !AssertMessage << Msg.str() << AssertExpr->getSourceRange(); + PrintContextStack(); } Failed = true; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -59,6 +59,8 @@ - Improved ``-O0`` code generation for calls to ``std::forward_like``. Similarly to ``std::move, std::forward`` et al. it is now treated as a compiler builtin and implemented directly rather than instantiating the definition from the standard library. +- Implemented `CWG2518 <https://wg21.link/CWG2518>`_ which allows ``static_assert(false)`` + to not be ill-formed when its condition is evaluated in the context of a template definition. C++20 Feature Support ^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits