From 6f20c42cc162ac3725584547ab4933bae4c78665 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Mon, 16 Nov 2020 19:59:35 -0500 Subject: [PATCH] c++: Reject identifier label in constexpr [PR97846] [dcl.constexpr]/3 says that the function-body of a constexpr function shall not contain an identifier label, but we aren't enforcing that. This patch implements that. Of course, we can't reject artificial labels. gcc/cp/ChangeLog: PR c++/97846 * constexpr.c (potential_constant_expression_1): Reject LABEL_EXPRs that use non-artifical LABEL_DECLs. gcc/testsuite/ChangeLog: PR c++/97846 * g++.dg/cpp1y/constexpr-label.C: New test. --- gcc/cp/constexpr.c | 9 ++++++++- gcc/testsuite/g++.dg/cpp1y/constexpr-label.C | 9 +++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-label.C diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index ef37b3043a5..4513d40cda5 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -7502,7 +7502,6 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now, case OVERLOAD: case TEMPLATE_ID_EXPR: case LABEL_DECL: - case LABEL_EXPR: case CASE_LABEL_EXPR: case PREDICT_EXPR: case CONST_DECL: @@ -8411,6 +8410,14 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now, return false; } + case LABEL_EXPR: + t = LABEL_EXPR_LABEL (t); + if (DECL_ARTIFICIAL (t)) + return true; + else if (flags & tf_error) + error_at (loc, "label definition is not a constant expression"); + return false; + case ANNOTATE_EXPR: return RECUR (TREE_OPERAND (t, 0), rval); diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-label.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-label.C new file mode 100644 index 00000000000..a2d113c186f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-label.C @@ -0,0 +1,9 @@ +// PR c++/97846 +// { dg-do compile { target c++14 } } + +constexpr int +f () +{ +x: // { dg-error "label definition is not a constant expression" } + return 42; +} -- 2.30.2