]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/21619 (__builtin_constant_p(&"Hello"[0])?1:-1 not compile-time constant)
authorMark Mitchell <mark@codesourcery.com>
Sun, 5 Jun 2005 16:46:54 +0000 (16:46 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 5 Jun 2005 16:46:54 +0000 (16:46 +0000)
PR c++/21619
* cp-tree.h (DECL_IS_BUILTIN_CONSTANT_P): New macro.
* parser.c (cp_parser_postfix_expression): Allow non-constant
expressions as arguments to __builtin_constant_p.
* tree.c (builtin_valid_in_constant_expr_p): Use
DECL_IS_BUILTIN_CONSTANT_P.

From-SVN: r100627

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/tree.c

index 3a840fb72aacd2277cda7b567b73969079486dd5..5af557607f0bf1d5d1966689bf14a3636e45ddbc 100644 (file)
@@ -1,3 +1,12 @@
+2005-06-05  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/21619
+       * cp-tree.h (DECL_IS_BUILTIN_CONSTANT_P): New macro.
+       * parser.c (cp_parser_postfix_expression): Allow non-constant
+       expressions as arguments to __builtin_constant_p.
+       * tree.c (builtin_valid_in_constant_expr_p): Use
+       DECL_IS_BUILTIN_CONSTANT_P. 
+
 2005-06-03  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/21853
index eaaa6a0e023eb3979d3006ad52bb38f4f13823fc..0f913ba0929e55eaae36f5deaf5007961e6893cf 100644 (file)
@@ -1790,6 +1790,12 @@ struct lang_decl GTY(())
 #define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
   (DECL_LANG_SPECIFIC (NODE)->decl_flags.has_in_charge_parm_p)
 
+/* Nonzero if DECL is a declaration of __builtin_constant_p.  */
+#define DECL_IS_BUILTIN_CONSTANT_P(NODE)               \
+  (TREE_CODE (NODE) == FUNCTION_DECL                   \
+   && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL    \
+   && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
+
 /* Nonzero if NODE is an overloaded `operator delete[]' function.  */
 #define DECL_ARRAY_DELETE_OPERATOR_P(NODE) \
   (DECL_OVERLOADED_OPERATOR_P (NODE) == VEC_DELETE_EXPR)
index e46eef96055232bb1aebcafd51c60cefe7718a47..3507546adc0c3f94f3412ca874a7d6b619904ce0 100644 (file)
@@ -4049,10 +4049,34 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p)
          /* postfix-expression ( expression-list [opt] ) */
          {
            bool koenig_p;
-           tree args = (cp_parser_parenthesized_expression_list
-                        (parser, false, 
-                         /*cast_p=*/false,
-                         /*non_constant_p=*/NULL));
+           bool is_builtin_constant_p;
+           bool saved_integral_constant_expression_p = false;
+           bool saved_non_integral_constant_expression_p = false;
+           tree args;
+
+           is_builtin_constant_p 
+             = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
+           if (is_builtin_constant_p)
+             {
+               /* The whole point of __builtin_constant_p is to allow
+                  non-constant expressions to appear as arguments.  */
+               saved_integral_constant_expression_p
+                 = parser->integral_constant_expression_p;
+               saved_non_integral_constant_expression_p
+                 = parser->non_integral_constant_expression_p;
+               parser->integral_constant_expression_p = false;
+             }
+           args = (cp_parser_parenthesized_expression_list
+                   (parser, /*is_attribute_list=*/false, 
+                    /*cast_p=*/false,
+                    /*non_constant_p=*/NULL));
+           if (is_builtin_constant_p)
+             {
+               parser->integral_constant_expression_p
+                 = saved_integral_constant_expression_p;
+               parser->non_integral_constant_expression_p
+                 = saved_non_integral_constant_expression_p;
+             }
 
            if (args == error_mark_node)
              {
index cbf68ee4ce7a8f58597398fd2838958a265f1c8c..7a46577fc9ca29d4f9a676208bde5847881e00af 100644 (file)
@@ -223,9 +223,7 @@ builtin_valid_in_constant_expr_p (tree decl)
 {
   /* At present BUILT_IN_CONSTANT_P is the only builtin we're allowing
      in constant-expressions.  We may want to add other builtins later. */
-  return TREE_CODE (decl) == FUNCTION_DECL
-    && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
-    && DECL_FUNCTION_CODE (decl) == BUILT_IN_CONSTANT_P;
+  return DECL_IS_BUILTIN_CONSTANT_P (decl);
 }
 
 /* Build a TARGET_EXPR, initializing the DECL with the VALUE.  */