aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2013-06-14 22:49:11 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-06-14 22:49:11 +0000
commit929f647a01f0ebb28dca062c669ed2dd8b83c5ef (patch)
tree7129c3cc77ae702640130b4a898a259b40160072
parentd1aa4a76d271acb5f0a56ee7f4822a835baba955 (diff)
downloadgcc-929f647a01f0ebb28dca062c669ed2dd8b83c5ef.zip
gcc-929f647a01f0ebb28dca062c669ed2dd8b83c5ef.tar.gz
gcc-929f647a01f0ebb28dca062c669ed2dd8b83c5ef.tar.bz2
re PR c++/51413 (Broken diagnostic with __builtin_offsetof)
/cp 2013-06-14 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51413 * semantics.c (finish_offsetof): Handle INDIRECT_REF as expr. /testsuite 2013-06-14 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51413 * g++.dg/ext/builtin-offsetof1.C: New. From-SVN: r200110
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/builtin-offsetof1.C9
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" }