[clang] Draft (PR #110773)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 1 18:09:07 PDT 2024
https://github.com/c8ef updated https://github.com/llvm/llvm-project/pull/110773
>From 59c8706f4bb83228fb476d3205d96f767080a0fc Mon Sep 17 00:00:00 2001
From: c8ef <c8ef at outlook.com>
Date: Wed, 2 Oct 2024 08:54:59 +0800
Subject: [PATCH 1/2] this diagose
---
clang/lib/Parse/ParseDecl.cpp | 15 +--------------
clang/lib/Sema/SemaExprCXX.cpp | 21 +++++++++++++++++----
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index a04eed9873c0d4..122a05be1c039a 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -7950,21 +7950,8 @@ void Parser::ParseParameterDeclarationClause(
// Parse a C++23 Explicit Object Parameter
// We do that in all language modes to produce a better diagnostic.
SourceLocation ThisLoc;
- if (getLangOpts().CPlusPlus && Tok.is(tok::kw_this)) {
+ if (getLangOpts().CPlusPlus && Tok.is(tok::kw_this))
ThisLoc = ConsumeToken();
- // C++23 [dcl.fct]p6:
- // An explicit-object-parameter-declaration is a parameter-declaration
- // with a this specifier. An explicit-object-parameter-declaration
- // shall appear only as the first parameter-declaration of a
- // parameter-declaration-list of either:
- // - a member-declarator that declares a member function, or
- // - a lambda-declarator.
- //
- // The parameter-declaration-list of a requires-expression is not such
- // a context.
- if (DeclaratorCtx == DeclaratorContext::RequiresExpr)
- Diag(ThisLoc, diag::err_requires_expr_explicit_object_parameter);
- }
ParsedTemplateInfo TemplateInfo;
ParseDeclarationSpecifiers(DS, TemplateInfo, AS_none,
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index b30414a8a8277a..e4d9c63651ea24 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -9519,15 +9519,28 @@ Sema::ActOnStartRequiresExpr(SourceLocation RequiresKWLoc,
} else if (Param->getType().hasQualifiers()) {
Diag(Param->getBeginLoc(), diag::err_void_param_qualified);
}
- }
-
- if (Param->hasDefaultArg())
+ } else if (Param->hasDefaultArg()) {
// C++2a [expr.prim.req] p4
// [...] A local parameter of a requires-expression shall not have a
// default argument. [...]
Diag(Param->getDefaultArgRange().getBegin(),
diag::err_requires_expr_local_parameter_default_argument);
- // Ignore default argument and move on
+ // Ignore default argument and move on
+ } else if (Param->isExplicitObjectParameter()) {
+ // C++23 [dcl.fct]p6:
+ // An explicit-object-parameter-declaration is a parameter-declaration
+ // with a this specifier. An explicit-object-parameter-declaration
+ // shall appear only as the first parameter-declaration of a
+ // parameter-declaration-list of either:
+ // - a member-declarator that declares a member function, or
+ // - a lambda-declarator.
+ //
+ // The parameter-declaration-list of a requires-expression is not such
+ // a context.
+ Diag(Param->getBeginLoc(),
+ diag::err_requires_expr_explicit_object_parameter);
+ Param->setExplicitObjectParameterLoc(SourceLocation());
+ }
Param->setDeclContext(Body);
// If this has an identifier, add it to the scope stack.
>From 52d566845574da6b274d2a8187fe8a5f6e47bfcd Mon Sep 17 00:00:00 2001
From: c8ef <c8ef at outlook.com>
Date: Wed, 2 Oct 2024 09:08:51 +0800
Subject: [PATCH 2/2] this diagose loc
---
clang/lib/Sema/SemaExprCXX.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index e4d9c63651ea24..d490452e91c3bb 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -9537,7 +9537,7 @@ Sema::ActOnStartRequiresExpr(SourceLocation RequiresKWLoc,
//
// The parameter-declaration-list of a requires-expression is not such
// a context.
- Diag(Param->getBeginLoc(),
+ Diag(Param->getExplicitObjectParamThisLoc(),
diag::err_requires_expr_explicit_object_parameter);
Param->setExplicitObjectParameterLoc(SourceLocation());
}
More information about the cfe-commits
mailing list