aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/constexpr.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-02-03 11:11:55 -0500
committerJason Merrill <jason@redhat.com>2020-02-03 17:50:36 -0500
commit8fda2c274ac66d60c1dfc1349e9efb4e8c2a3580 (patch)
tree9c5d0041838e29c8f570733b021348cd3effa683 /gcc/cp/constexpr.c
parent19e43cbce353b63a05c3b7c39d83a2e32c9f911f (diff)
downloadgcc-8fda2c274ac66d60c1dfc1349e9efb4e8c2a3580.zip
gcc-8fda2c274ac66d60c1dfc1349e9efb4e8c2a3580.tar.gz
gcc-8fda2c274ac66d60c1dfc1349e9efb4e8c2a3580.tar.bz2
c++: Allow parm of empty class type in constexpr.
Since copying a class object is defined in terms of the copy constructor, copying an empty class is OK even if it would otherwise not be usable in a constant expression. Relatedly, using a parameter as an lvalue is no more problematic than a local variable, and calling a member function uses the object as an lvalue. PR c++/91953 * constexpr.c (potential_constant_expression_1) [PARM_DECL]: Allow empty class type. [COMPONENT_REF]: A member function reference doesn't use the object as an rvalue.
Diffstat (limited to 'gcc/cp/constexpr.c')
-rw-r--r--gcc/cp/constexpr.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 577022e..a39ba41 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -7013,8 +7013,13 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
return true;
case PARM_DECL:
- if (now)
+ if (now && want_rval)
{
+ tree type = TREE_TYPE (t);
+ if (dependent_type_p (type)
+ || is_really_empty_class (type, /*ignore_vptr*/false))
+ /* An empty class has no data to read. */
+ return true;
if (flags & tf_error)
error ("%qE is not a constant expression", t);
return false;
@@ -7270,10 +7275,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
#endif
return RECUR (t, any);
- case REALPART_EXPR:
- case IMAGPART_EXPR:
case COMPONENT_REF:
- case BIT_FIELD_REF:
case ARROW_EXPR:
case OFFSET_REF:
/* -- a class member access unless its postfix-expression is
@@ -7282,6 +7284,15 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
postfix-expression being a potential constant expression. */
if (type_unknown_p (t))
return true;
+ if (is_overloaded_fn (t))
+ /* In a template, a COMPONENT_REF of a function expresses ob.fn(),
+ which uses ob as an lvalue. */
+ want_rval = false;
+ gcc_fallthrough ();
+
+ case REALPART_EXPR:
+ case IMAGPART_EXPR:
+ case BIT_FIELD_REF:
return RECUR (TREE_OPERAND (t, 0), want_rval);
case EXPR_PACK_EXPANSION: