diff mbox

[C++] Reject variably modified types in operator new

Message ID 4FC91E41.1080406@redhat.com
State New
Headers show

Commit Message

Florian Weimer June 1, 2012, 7:55 p.m. UTC
On 06/01/2012 06:19 PM, Jason Merrill wrote:
> On 06/01/2012 11:40 AM, Florian Weimer wrote:
>> I'm puzzled why build_new is even invoked after detecting that there is
>> a non-constant expression.
>
> I'd accept a patch to change that.

I don't really now what I'm doing here.  But I noticed that in 
cp_parser_constant_expression, a failure in 
require_potential_rvalue_constant_expression is not reported to the caller.

This changes error reporting, and a few test cases need adjustment.  In 
some, reporting is better, in others, it's slightly worse.  I need to 
make a second pass over the changes to make sure that they are alright.

Does this change make any sense at all?

Comments

Jason Merrill June 4, 2012, 4:51 p.m. UTC | #1
On 06/01/2012 03:55 PM, Florian Weimer wrote:
> On 06/01/2012 06:19 PM, Jason Merrill wrote:
>> On 06/01/2012 11:40 AM, Florian Weimer wrote:
>>> I'm puzzled why build_new is even invoked after detecting that there is
>>> a non-constant expression.
>>
>> I'd accept a patch to change that.
>
> I don't really now what I'm doing here. But I noticed that in
> cp_parser_constant_expression, a failure in
> require_potential_rvalue_constant_expression is not reported to the caller.
>
> This changes error reporting, and a few test cases need adjustment. In
> some, reporting is better, in others, it's slightly worse. I need to
> make a second pass over the changes to make sure that they are alright.

Oh, right.  I think I tried this change once and then decided that 
things were better without it, but I don't remember why.  The change 
looks reasonable by itself; what changes are you seeing in error reporting.

Jason
diff mbox

Patch

Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c	(revision 188104)
+++ gcc/cp/parser.c	(working copy)
@@ -7701,8 +7701,9 @@  cp_parser_constant_expression (cp_parser* parser,
  	 separately in e.g. cp_parser_template_argument.  */
        bool is_const = potential_rvalue_constant_expression (expression);
        parser->non_integral_constant_expression_p = !is_const;
-      if (!is_const && !allow_non_constant_p)
-	require_potential_rvalue_constant_expression (expression);
+      if (!is_const && !allow_non_constant_p
+	  && !require_potential_rvalue_constant_expression (expression))
+	expression = error_mark_node;
      }
    if (allow_non_constant_p)
      *non_constant_p = parser->non_integral_constant_expression_p;