diff options
author | Marek Polacek <polacek@redhat.com> | 2020-11-16 19:59:35 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-11-21 16:08:33 -0500 |
commit | 6f20c42cc162ac3725584547ab4933bae4c78665 (patch) | |
tree | a32c6e9475135528dc07fdd8cfd68404d99cdbf1 /gcc | |
parent | 0999f26098598fe0a499c5b79ad23678ccfe583a (diff) | |
download | gcc-6f20c42cc162ac3725584547ab4933bae4c78665.zip gcc-6f20c42cc162ac3725584547ab4933bae4c78665.tar.gz gcc-6f20c42cc162ac3725584547ab4933bae4c78665.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/constexpr.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-label.C | 9 |
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index ef37b30..4513d40 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 0000000..a2d113c --- /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; +} |