diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/builtin-offsetof1.C | 9 |
4 files changed, 30 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d4cded5..1ffeed3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2013-06-14 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/51413 + * semantics.c (finish_offsetof): Handle INDIRECT_REF as expr. + +2013-06-14 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/57599 * rtti.c (build_dynamic_cast_1): In case of cast to an unambiguous accessible base simply forward to build_static_cast. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index b5c3b0a..0a700b7 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 %<offsetof%> to member function %qD", expr); + if (TREE_CODE (expr) == INDIRECT_REF) + error ("second operand of %<offsetof%> 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 %<offsetof%> 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 40ff17f..58be5b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-14 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51413 + * g++.dg/ext/builtin-offsetof1.C: New. + 2013-06-14 Vidya Praveen <vidyapraveen@arm.com> * 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 0000000..5c5e9cf --- /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" } |