]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
parser.c (cp_parser_unary_expression): Call pedwarn for alignof with expression.
authorRodrigo Rivas Costa <rodrigorivascosta@gmail.com>
Wed, 22 Dec 2010 19:23:00 +0000 (19:23 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 22 Dec 2010 19:23:00 +0000 (14:23 -0500)
* parser.c (cp_parser_unary_expression): Call pedwarn for alignof
with expression.

From-SVN: r168179

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alignof2.C [new file with mode: 0644]

index 872cd0617cbb99f42464a0266f4df75e38305e39..62b7d8d8197cbcf6694fb49da5168b59ccc0e653 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-22  Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
+
+       * parser.c (cp_parser_unary_expression): Call pedwarn for alignof
+       with expression.
+
 2010-12-18  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * parser.c (cp_parser_objc_try_catch_finally_statement): Call
index 1a2d4253c7787dd6643a2d6ff1d1b6437d48ae2d..743d774b5a35fa431e140aa84c60b258adf7b85b 100644 (file)
@@ -5888,6 +5888,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
      unary-operator cast-expression
      sizeof unary-expression
      sizeof ( type-id )
+     alignof ( type-id )  [C++0x]
      new-expression
      delete-expression
 
@@ -5897,6 +5898,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
      __extension__ cast-expression
      __alignof__ unary-expression
      __alignof__ ( type-id )
+     alignof unary-expression  [C++0x]
      __real__ cast-expression
      __imag__ cast-expression
      && identifier
@@ -5938,7 +5940,19 @@ cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p,
            if (TYPE_P (operand))
              return cxx_sizeof_or_alignof_type (operand, op, true);
            else
-             return cxx_sizeof_or_alignof_expr (operand, op, true);
+             {
+               /* ISO C++ defines alignof only with types, not with
+                  expressions. So pedwarn if alignof is used with a non-
+                  type expression. However, __alignof__ is ok.  */
+               if (cxx_dialect >= cxx0x
+                   && !strcmp (IDENTIFIER_POINTER (token->u.value),
+                               "alignof"))
+                 pedwarn (token->location, OPT_pedantic,
+                          "ISO C++ does not allow %<alignof%> "
+                          "with a non-type");
+
+               return cxx_sizeof_or_alignof_expr (operand, op, true);
+             }
          }
 
        case RID_NEW:
index dd58aa54524a667d6928fb33eef5525fefcec0f1..06257d17853dfb73b5c7eccace025c8fe001ee1a 100644 (file)
@@ -1,3 +1,7 @@
+2010-12-22  Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
+
+       * g++.dg/cpp0x/alignof2.C: New.
+
 2010-12-22  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/45934
diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof2.C b/gcc/testsuite/g++.dg/cpp0x/alignof2.C
new file mode 100644 (file)
index 0000000..7c5aad3
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-std=c++0x -pedantic" }
+int main(void)
+{
+  alignof(int); //ok with a type but not with an expression
+  alignof(3);   // { dg-warning "alignof" }
+}