https://github.com/c8ef updated https://github.com/llvm/llvm-project/pull/109831
>From 9c112e7f88be2fc71f33ce4332d2ea500e479963 Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Tue, 24 Sep 2024 16:48:39 +0000 Subject: [PATCH 1/6] require void --- clang/lib/Sema/SemaExprCXX.cpp | 11 +++++++++++ .../invalid-requirement-requires-parameter.cpp | 15 +++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index ac3fe6ab8f9bd0..2dc7f46837f6d1 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -9509,6 +9509,17 @@ Sema::ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, PushDeclContext(BodyScope, Body); for (ParmVarDecl *Param : LocalParameters) { + if (Param->getType()->isVoidType()) { + if (LocalParameters.size() > 1) { + Diag(Param->getBeginLoc(), diag::err_void_only_param); + } else if (Param->getIdentifier()) { + Diag(Param->getBeginLoc(), diag::err_param_with_void_type); + } else if (Param->getType().hasQualifiers()) { + Diag(Param->getBeginLoc(), diag::err_void_param_qualified); + Body->setInvalidDecl(); + } + } + if (Param->hasDefaultArg()) // C++2a [expr.prim.req] p4 // [...] A local parameter of a requires-expression shall not have a diff --git a/clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp b/clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp new file mode 100644 index 00000000000000..01aa0ca4d229b5 --- /dev/null +++ b/clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp @@ -0,0 +1,15 @@ +// RUN: %clang -fsyntax-only -std=c++2a -Xclang -verify %s + +namespace GH109538 { +static_assert(requires(void *t) { t; }); +static_assert(requires(void) { 42; }); +static_assert(requires(void t) { // expected-error {{argument may not have 'void' type}} + t; +}); +static_assert(requires(void t, int a) { // expected-error {{'void' must be the first and only parameter if specified}} + t; +}); +static_assert(requires(const void) { // expected-error {{'void' as parameter must not have type qualifiers}} + 42; +}); +} // namespace GH109538 >From 8206940c634a3f32d273c75d499fdc4beb683e88 Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Tue, 24 Sep 2024 16:52:05 +0000 Subject: [PATCH 2/6] fix --- clang/lib/Sema/SemaExprCXX.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 2dc7f46837f6d1..d0914d990be6a7 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -9512,8 +9512,10 @@ Sema::ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, if (Param->getType()->isVoidType()) { if (LocalParameters.size() > 1) { Diag(Param->getBeginLoc(), diag::err_void_only_param); + Body->setInvalidDecl(); } else if (Param->getIdentifier()) { Diag(Param->getBeginLoc(), diag::err_param_with_void_type); + Body->setInvalidDecl(); } else if (Param->getType().hasQualifiers()) { Diag(Param->getBeginLoc(), diag::err_void_param_qualified); Body->setInvalidDecl(); >From 7af1afbb6bd5fd87c47a684555b065bcada4e9a2 Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Mon, 30 Sep 2024 05:45:53 +0000 Subject: [PATCH 3/6] update test --- .../expr.prim/expr.prim.req/requires-expr.cpp | 16 +++++++++++++++- .../invalid-requirement-requires-parameter.cpp | 15 --------------- 2 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.req/requires-expr.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.req/requires-expr.cpp index 90a38292d15d35..fff5cdc89f3ea1 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.req/requires-expr.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.req/requires-expr.cpp @@ -65,4 +65,18 @@ template<typename T> requires requires { T::value; S<T>::s; } struct r4 { }; using r4i = r4<int>; -// expected-error@-1 {{constraints not satisfied for class template 'r4' [with T = int]}} \ No newline at end of file +// expected-error@-1 {{constraints not satisfied for class template 'r4' [with T = int]}} + +namespace GH109538 { +static_assert(requires(void *t) { t; }); +static_assert(requires(void) { 42; }); +static_assert(!requires(void t) { // expected-error {{argument may not have 'void' type}} + t; +}); +static_assert(!requires(void t, int a) { // expected-error {{'void' must be the first and only parameter if specified}} + t; +}); +static_assert(!requires(const void) { // expected-error {{'void' as parameter must not have type qualifiers}} + 42; +}); +} // namespace GH109538 diff --git a/clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp b/clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp deleted file mode 100644 index 01aa0ca4d229b5..00000000000000 --- a/clang/test/SemaCXX/invalid-requirement-requires-parameter.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// RUN: %clang -fsyntax-only -std=c++2a -Xclang -verify %s - -namespace GH109538 { -static_assert(requires(void *t) { t; }); -static_assert(requires(void) { 42; }); -static_assert(requires(void t) { // expected-error {{argument may not have 'void' type}} - t; -}); -static_assert(requires(void t, int a) { // expected-error {{'void' must be the first and only parameter if specified}} - t; -}); -static_assert(requires(const void) { // expected-error {{'void' as parameter must not have type qualifiers}} - 42; -}); -} // namespace GH109538 >From 590727f89686858921addfa89b527fd3f9d1eb3e Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Mon, 30 Sep 2024 05:46:19 +0000 Subject: [PATCH 4/6] static assert --- clang/lib/AST/ExprConcepts.cpp | 3 +++ clang/lib/Sema/SemaExprCXX.cpp | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/ExprConcepts.cpp b/clang/lib/AST/ExprConcepts.cpp index 0704630c0fc266..4a77050d996b2e 100644 --- a/clang/lib/AST/ExprConcepts.cpp +++ b/clang/lib/AST/ExprConcepts.cpp @@ -153,6 +153,9 @@ RequiresExpr::RequiresExpr(ASTContext &C, SourceLocation RequiresKWLoc, std::copy(Requirements.begin(), Requirements.end(), getTrailingObjects<concepts::Requirement *>()); RequiresExprBits.IsSatisfied |= Dependent; + RequiresExprBits.IsSatisfied &= + llvm::none_of(LocalParameters, + [](ParmVarDecl *Param) { return Param->isInvalidDecl(); }); // FIXME: move the computing dependency logic to ComputeDependence.h if (ContainsUnexpandedParameterPack) setDependence(getDependence() | ExprDependence::UnexpandedPack); diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index d0914d990be6a7..4ec84d9c12afce 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -9512,13 +9512,13 @@ Sema::ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, if (Param->getType()->isVoidType()) { if (LocalParameters.size() > 1) { Diag(Param->getBeginLoc(), diag::err_void_only_param); - Body->setInvalidDecl(); + Param->setInvalidDecl(); } else if (Param->getIdentifier()) { Diag(Param->getBeginLoc(), diag::err_param_with_void_type); - Body->setInvalidDecl(); + Param->setInvalidDecl(); } else if (Param->getType().hasQualifiers()) { Diag(Param->getBeginLoc(), diag::err_void_param_qualified); - Body->setInvalidDecl(); + Param->setInvalidDecl(); } } >From a2b0e45326bd29bdb4848956505eb9acd85dbcb3 Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Mon, 30 Sep 2024 05:51:03 +0000 Subject: [PATCH 5/6] release note --- clang/docs/ReleaseNotes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e511614fcf2451..a503420386a045 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -336,6 +336,8 @@ Improvements to Clang's diagnostics local variables passed to function calls using the ``[[clang::musttail]]`` attribute. +- Clang now diagnoses when a required expression has a local parameter of void type, aligning with the function parameter (#GH109831). + Improvements to Clang's time-trace ---------------------------------- >From fe609a4fbd68ef80ea13adf6c02fb89054eaf4f2 Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Mon, 30 Sep 2024 05:52:40 +0000 Subject: [PATCH 6/6] const --- clang/lib/AST/ExprConcepts.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ExprConcepts.cpp b/clang/lib/AST/ExprConcepts.cpp index 4a77050d996b2e..484931989ffbbb 100644 --- a/clang/lib/AST/ExprConcepts.cpp +++ b/clang/lib/AST/ExprConcepts.cpp @@ -154,8 +154,9 @@ RequiresExpr::RequiresExpr(ASTContext &C, SourceLocation RequiresKWLoc, getTrailingObjects<concepts::Requirement *>()); RequiresExprBits.IsSatisfied |= Dependent; RequiresExprBits.IsSatisfied &= - llvm::none_of(LocalParameters, - [](ParmVarDecl *Param) { return Param->isInvalidDecl(); }); + llvm::none_of(LocalParameters, [](const ParmVarDecl *Param) { + return Param->isInvalidDecl(); + }); // FIXME: move the computing dependency logic to ComputeDependence.h if (ContainsUnexpandedParameterPack) setDependence(getDependence() | ExprDependence::UnexpandedPack); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits