From ccd2b322781729ee41f7f44eae1b519c6d0ec4c7 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 6 Oct 2010 14:35:25 +0000 Subject: [PATCH] re PR c++/45908 ([C++0x] ICE involving decltype: in tree_low_cst, at tree.h:4114) PR c++/45908 * typeck.c (cp_build_addr_expr_1): Add check for incomplete types in code folding offsetof-like computations. From-SVN: r165031 --- 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 e347e6df2527..8143763a10a6 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 b2b8e5f5f78a..ff5714ddb950 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 8cab44c376f1..187ba7e651d1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-10-06 Eric Botcazou + + * g++.dg/cpp0x/pr45908.C: New test. + 2010-10-06 Eric Botcazou * gnat.dg/opt6.ad[sb]: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/pr45908.C b/gcc/testsuite/g++.dg/cpp0x/pr45908.C new file mode 100644 index 000000000000..1a821e5d83b4 --- /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" } +};