From: Paolo Carlini Date: Fri, 14 Jun 2013 22:49:11 +0000 (+0000) Subject: re PR c++/51413 (Broken diagnostic with __builtin_offsetof) X-Git-Tag: releases/gcc-4.9.0~5389 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=929f647a01f0ebb28dca062c669ed2dd8b83c5ef;p=thirdparty%2Fgcc.git re PR c++/51413 (Broken diagnostic with __builtin_offsetof) /cp 2013-06-14 Paolo Carlini PR c++/51413 * semantics.c (finish_offsetof): Handle INDIRECT_REF as expr. /testsuite 2013-06-14 Paolo Carlini PR c++/51413 * g++.dg/ext/builtin-offsetof1.C: New. From-SVN: r200110 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d4cded580847..1ffeed336195 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-06-14 Paolo Carlini + + PR c++/51413 + * semantics.c (finish_offsetof): Handle INDIRECT_REF as expr. + 2013-06-14 Paolo Carlini PR c++/57599 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index b5c3b0a1fefd..0a700b7a0f6b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3690,10 +3690,17 @@ finish_offsetof (tree expr) || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE || TREE_TYPE (expr) == unknown_type_node) { - if (TREE_CODE (expr) == COMPONENT_REF - || TREE_CODE (expr) == COMPOUND_EXPR) - expr = TREE_OPERAND (expr, 1); - error ("cannot apply % to member function %qD", expr); + if (TREE_CODE (expr) == INDIRECT_REF) + error ("second operand of % is neither a single " + "identifier nor a sequence of member accesses and " + "array references"); + else + { + if (TREE_CODE (expr) == COMPONENT_REF + || TREE_CODE (expr) == COMPOUND_EXPR) + expr = TREE_OPERAND (expr, 1); + error ("cannot apply % to member function %qD", expr); + } return error_mark_node; } if (REFERENCE_REF_P (expr)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 40ff17f23894..58be5b3543ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-14 Paolo Carlini + + PR c++/51413 + * g++.dg/ext/builtin-offsetof1.C: New. + 2013-06-14 Vidya Praveen * gcc.target/aarch64/vect_smlal_1.c: New file. diff --git a/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C b/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C new file mode 100644 index 000000000000..5c5e9cf246b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C @@ -0,0 +1,9 @@ +// PR c++/51413 +// { dg-options "-w" } + +struct A +{ + static void foo(); +}; + +int i = __builtin_offsetof(A, foo[1]); // { dg-error "neither a single identifier nor a sequence of member accesses and array references" }