aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-07-01 09:36:17 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-07-01 09:36:17 -0400
commita174e38c098d49c437142b7a6d31f065a998d50c (patch)
treeb1300337c37d69c95677c93bd9bcf8a32ac08320
parent6bbec3e1561a40c4b0870df42dbcbfc88be89dab (diff)
downloadgcc-a174e38c098d49c437142b7a6d31f065a998d50c.zip
gcc-a174e38c098d49c437142b7a6d31f065a998d50c.tar.gz
gcc-a174e38c098d49c437142b7a6d31f065a998d50c.tar.bz2
re PR c++/49085 (Crash with SIGSEGV during compilation.)
PR c++/49085 * semantics.c (finish_offsetof): Complain about incomplete type. From-SVN: r175758
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/offsetof2.C10
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cc95078..842d049 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-01 Jason Merrill <jason@redhat.com>
+
+ PR c++/49085
+ * semantics.c (finish_offsetof): Complain about incomplete type.
+
2011-06-30 Jason Merrill <jason@redhat.com>
PR c++/49387
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index ad68a01..a704aa3 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -3422,6 +3422,12 @@ finish_offsetof (tree expr)
}
if (REFERENCE_REF_P (expr))
expr = TREE_OPERAND (expr, 0);
+ if (TREE_CODE (expr) == COMPONENT_REF)
+ {
+ tree object = TREE_OPERAND (expr, 0);
+ if (!complete_type_or_else (TREE_TYPE (object), object))
+ return error_mark_node;
+ }
return fold_offsetof (expr, NULL_TREE);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 857ed56..8f2053a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-01 Jason Merrill <jason@redhat.com>
+
+ PR c++/49085
+ * g++.dg/template/offsetof2.C: New.
+
2011-07-01 Kai Tietz <ktietz@redhat.com>
* gcc.dg/tree-ssa/bitwise-sink.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/offsetof2.C b/gcc/testsuite/g++.dg/template/offsetof2.C
new file mode 100644
index 0000000..da888f7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/offsetof2.C
@@ -0,0 +1,10 @@
+// PR c++/49085
+
+template <class T>
+struct A // { dg-error "declaration" }
+{
+ int i, j;
+ int ar[__builtin_offsetof(A,j)]; // { dg-error "incomplete type" }
+};
+
+A<int> a;