public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-4082] c++: Allow attributes on concepts - DR 2428
@ 2022-11-16 6:38 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-11-16 6:38 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:7f014022861b5b3f00be9bb32fe3fe772517ddac
commit r13-4082-g7f014022861b5b3f00be9bb32fe3fe772517ddac
Author: Jakub Jelinek <jakub@redhat.com>
Date: Wed Nov 16 07:37:05 2022 +0100
c++: Allow attributes on concepts - DR 2428
The following patch adds parsing of attributes to concept definition,
allows deprecated attribute to be specified (as CONCEPT_DECL now needs
to be checked in c-family/c-attribs.cc, I had to move its declaration
from cp/*.def to c-family/*.def) and checks TREE_DEPRECATED in
build_standard_check (not sure if that is the right spot, or whether
it shouldn't be checked also for variable and function concepts and
how to write testcase coverage for that).
2022-11-16 Jakub Jelinek <jakub@redhat.com>
gcc/c-family/
* c-common.def (CONCEPT_DECL): New tree, moved here from
cp-tree.def.
* c-common.cc (c_common_init_ts): Handle CONCEPT_DECL.
* c-attribs.cc (handle_deprecated_attribute): Allow deprecated
attribute on CONCEPT_DECL.
gcc/cp/
* cp-tree.def (CONCEPT_DECL): Move to c-common.def.
* cp-objcp-common.cc (cp_common_init_ts): Don't handle CONCEPT_DECL
here.
* cp-tree.h (finish_concept_definition): Add ATTRS parameter.
* parser.cc (cp_parser_concept_definition): Parse attributes in
between identifier and =. Adjust finish_concept_definition
caller.
* pt.cc (finish_concept_definition): Add ATTRS parameter. Call
cplus_decl_attributes.
* constraint.cc (build_standard_check): If CONCEPT_DECL is
TREE_DEPRECATED, emit -Wdeprecated-declaration warnings.
gcc/testsuite/
* g++.dg/cpp2a/concepts-dr2428.C: New test.
Diff:
---
gcc/c-family/c-attribs.cc | 3 ++-
gcc/c-family/c-common.cc | 2 ++
gcc/c-family/c-common.def | 8 ++++++++
gcc/cp/constraint.cc | 2 ++
gcc/cp/cp-objcp-common.cc | 1 -
gcc/cp/cp-tree.def | 5 -----
gcc/cp/cp-tree.h | 2 +-
gcc/cp/parser.cc | 4 +++-
gcc/cp/pt.cc | 5 ++++-
gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C | 22 ++++++++++++++++++++++
10 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 92ac93ba2ce..07bca68e9b9 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -4211,7 +4211,8 @@ handle_deprecated_attribute (tree *node, tree name,
|| VAR_OR_FUNCTION_DECL_P (decl)
|| TREE_CODE (decl) == FIELD_DECL
|| TREE_CODE (decl) == CONST_DECL
- || objc_method_decl (TREE_CODE (decl)))
+ || objc_method_decl (TREE_CODE (decl))
+ || TREE_CODE (decl) == CONCEPT_DECL)
TREE_DEPRECATED (decl) = 1;
else if (TREE_CODE (decl) == LABEL_DECL)
{
diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index 71507d4cb0a..6f1f21bc4c1 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -8497,6 +8497,8 @@ c_common_init_ts (void)
MARK_TS_EXP (FOR_STMT);
MARK_TS_EXP (SWITCH_STMT);
MARK_TS_EXP (WHILE_STMT);
+
+ MARK_TS_DECL_COMMON (CONCEPT_DECL);
}
/* Build a user-defined numeric literal out of an integer constant type VALUE
diff --git a/gcc/c-family/c-common.def b/gcc/c-family/c-common.def
index dd8be7fdd3d..64956fc2ca1 100644
--- a/gcc/c-family/c-common.def
+++ b/gcc/c-family/c-common.def
@@ -81,6 +81,14 @@ DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0)
SWITCH_STMT_SCOPE, respectively. */
DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 4)
+/* Extensions for C++ Concepts. */
+
+/* Concept definition. This is not entirely different than a VAR_DECL
+ except that a) it must be a template, and b) doesn't have the wide
+ range of value and linkage options available to variables. Used
+ by C++ FE and in c-family attribute handling. */
+DEFTREECODE (CONCEPT_DECL, "concept_decl", tcc_declaration, 0)
+
/*
Local variables:
mode:c
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index 3ddbd535330..a113d3e269e 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -1396,6 +1396,8 @@ build_standard_check (tree tmpl, tree args, tsubst_flags_t complain)
{
gcc_assert (standard_concept_p (tmpl));
gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
+ if (TREE_DEPRECATED (DECL_TEMPLATE_RESULT (tmpl)))
+ warn_deprecated_use (DECL_TEMPLATE_RESULT (tmpl), NULL_TREE);
tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
args = coerce_template_parms (parms, args, tmpl, complain);
if (args == error_mark_node)
diff --git a/gcc/cp/cp-objcp-common.cc b/gcc/cp/cp-objcp-common.cc
index e4df30d9720..7f76f2c669a 100644
--- a/gcc/cp/cp-objcp-common.cc
+++ b/gcc/cp/cp-objcp-common.cc
@@ -473,7 +473,6 @@ cp_common_init_ts (void)
/* New decls. */
MARK_TS_DECL_COMMON (TEMPLATE_DECL);
MARK_TS_DECL_COMMON (WILDCARD_DECL);
- MARK_TS_DECL_COMMON (CONCEPT_DECL);
MARK_TS_DECL_NON_COMMON (USING_DECL);
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index f83b4c54d43..3de8278e9f1 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -495,11 +495,6 @@ DEFTREECODE (OMP_DEPOBJ, "omp_depobj", tcc_statement, 2)
/* Extensions for Concepts. */
-/* Concept definition. This is not entirely different than a VAR_DECL
- except that a) it must be a template, and b) doesn't have the wide
- range of value and linkage options available to variables. */
-DEFTREECODE (CONCEPT_DECL, "concept_decl", tcc_declaration, 0)
-
/* Used to represent information associated with constrained declarations. */
DEFTREECODE (CONSTRAINT_INFO, "constraint_info", tcc_exceptional, 0)
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 8c9beb86568..07f96ea861f 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -8322,7 +8322,7 @@ struct diagnosing_failed_constraint
extern cp_expr finish_constraint_or_expr (location_t, cp_expr, cp_expr);
extern cp_expr finish_constraint_and_expr (location_t, cp_expr, cp_expr);
extern cp_expr finish_constraint_primary_expr (cp_expr);
-extern tree finish_concept_definition (cp_expr, tree);
+extern tree finish_concept_definition (cp_expr, tree, tree);
extern tree combine_constraint_expressions (tree, tree);
extern tree append_constraint (tree, tree);
extern tree get_constraints (const_tree);
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index e4021835ed5..c5929a6cc5f 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -29672,6 +29672,8 @@ cp_parser_concept_definition (cp_parser *parser)
return NULL_TREE;
}
+ tree attrs = cp_parser_attributes_opt (parser);
+
if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
{
cp_parser_skip_to_end_of_statement (parser);
@@ -29688,7 +29690,7 @@ cp_parser_concept_definition (cp_parser *parser)
but continue as if it were. */
cp_parser_consume_semicolon_at_end_of_statement (parser);
- return finish_concept_definition (id, init);
+ return finish_concept_definition (id, init, attrs);
}
// -------------------------------------------------------------------------- //
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index e6017b34c0c..0310e38c9b9 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -28928,7 +28928,7 @@ placeholder_type_constraint_dependent_p (tree t)
the TEMPLATE_DECL. */
tree
-finish_concept_definition (cp_expr id, tree init)
+finish_concept_definition (cp_expr id, tree init, tree attrs)
{
gcc_assert (identifier_p (id));
gcc_assert (processing_template_decl);
@@ -28962,6 +28962,9 @@ finish_concept_definition (cp_expr id, tree init)
DECL_CONTEXT (decl) = current_scope ();
DECL_INITIAL (decl) = init;
+ if (attrs)
+ cplus_decl_attributes (&decl, attrs, 0);
+
set_originating_module (decl, false);
/* Push the enclosing template. */
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C b/gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C
new file mode 100644
index 00000000000..d08ad36bd8c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-dr2428.C
@@ -0,0 +1,22 @@
+// DR 2428
+// { dg-do compile { target c++20 } }
+
+template<typename T>
+concept C1 [[deprecated]] = true;
+
+template<typename T>
+concept C2 __attribute__((deprecated)) = false;
+
+template<typename T>
+concept C3 [[deprecated]] = true;
+
+template<typename T>
+concept C4 __attribute__((deprecated)) = false;
+
+static_assert(C3<int>); // { dg-warning "'C3' is deprecated" }
+static_assert(C4<int>); // { dg-error "static assertion failed" }
+ // { dg-warning "'C4' is deprecated" "" { target *-*-* } .-1 }
+
+template<typename T>
+ requires C3<T> // { dg-warning "'C3' is deprecated" }
+int fn1(T t) { return 0; }
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-11-16 6:38 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-16 6:38 [gcc r13-4082] c++: Allow attributes on concepts - DR 2428 Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).