From 22bdb2aa647815e47c5947168cf36862b5fc5b87 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Wed, 6 Oct 2010 14:35:25 +0000 Subject: [PATCH] PR c++/45908 * typeck.c (cp_build_addr_expr_1): Add check for incomplete types in code folding offsetof-like computations. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165031 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/typeck.c | 1 + gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/pr45908.C | 18 ++++++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr45908.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e347e6d..8143763a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-10-06 Eric Botcazou + + PR c++/45908 + * typeck.c (cp_build_addr_expr_1): Add check for incomplete types in + code folding offsetof-like computations. + 2010-10-05 Nicola Pero PR objc++/31125 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index b2b8e5f..ff5714d 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4947,6 +4947,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain) && TREE_CODE (argtype) != METHOD_TYPE && argtype != unknown_type_node && (val = get_base_address (arg)) + && COMPLETE_TYPE_P (TREE_TYPE (val)) && TREE_CODE (val) == INDIRECT_REF && TREE_CONSTANT (TREE_OPERAND (val, 0))) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8cab44c..187ba7e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2010-10-06 Eric Botcazou + * g++.dg/cpp0x/pr45908.C: New test. + +2010-10-06 Eric Botcazou + * gnat.dg/opt6.ad[sb]: New test. 2010-10-06 Nicola Pero diff --git a/gcc/testsuite/g++.dg/cpp0x/pr45908.C b/gcc/testsuite/g++.dg/cpp0x/pr45908.C new file mode 100644 index 0000000..1a821e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr45908.C @@ -0,0 +1,18 @@ +// PR c++/45908 +// Testcase by Jonathan Wakely + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct vector { + struct iterator { }; + struct const_iterator { }; + iterator begin(); + const_iterator begin() const; +}; + +class block { + vector v; + auto end() const -> decltype(v.begin()) + { return v.begin(); } // { dg-error "conversion" } +}; -- 2.7.4