From 16ee0ee2c495bc475e0ba015c6b9fd4707692196 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 10 May 2013 14:17:37 +0000 Subject: [PATCH] PR c++/57047 * semantics.c (cxx_fold_indirect_ref): Fix thinko. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198777 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 3 ++ gcc/cp/semantics.c | 8 ++-- gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C | 54 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ad7235a..63cc714 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2013-05-10 Jason Merrill + PR c++/57047 + * semantics.c (cxx_fold_indirect_ref): Fix thinko. + PR c++/55149 * semantics.c (add_capture): Error rather than abort on copy capture of VLA. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d0db10a..3e78887 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7643,15 +7643,17 @@ cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base) } } } - /* *(foo *)fooarrptreturn> (*fooarrptr)[0] */ + /* *(foo *)fooarrptr => (*fooarrptr)[0] */ else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE && (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (TREE_TYPE (subtype))))) { tree type_domain; tree min_val = size_zero_node; - sub = cxx_fold_indirect_ref (loc, TREE_TYPE (subtype), sub, NULL); - if (!sub) + tree newsub = cxx_fold_indirect_ref (loc, TREE_TYPE (subtype), sub, NULL); + if (newsub) + sub = newsub; + else sub = build1_loc (loc, INDIRECT_REF, TREE_TYPE (subtype), sub); type_domain = TYPE_DOMAIN (TREE_TYPE (sub)); if (type_domain && TYPE_MIN_VALUE (type_domain)) diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C new file mode 100644 index 0000000..ee425ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr8.C @@ -0,0 +1,54 @@ +// PR c++/57047 +// { dg-require-effective-target c++11 } + +template +struct A; +template +struct A +{ + typedef T type; +}; +template +constexpr T && foo (typename A ::type & __t) noexcept +{ + return static_cast (__t); +} +template +struct B +{ + T1 t1; + T2 t2; + template + constexpr B (U && __x, const T2 & __y) : t1 (foo (__x)), t2 (__y) {} +}; +static inline constexpr bool +fn1 (const char c) +{ + return ('0' <= c) && (c <= '9'); +} +static inline constexpr bool +fn2 (const char c) +{ + return (('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z')); +} +static constexpr bool +fn3 (const char *const x) +{ + return (x[1] == '\0' && x[0] == ']') ? true : (!fn1 (x[0])) ? false : fn3 (&x[1]); +} +static constexpr bool +fn4 (const char *const x) +{ + return (x[0] == '\0') ? fn3 (&x[1]) : fn4 (&x[1]); +} +static inline constexpr bool +fn5 (const char *const x) +{ + return fn2 (x[0]) ? fn4 (x) : false; +} +struct C final +{ + constexpr C (const char *const t1) : c (fn5 (t1) ? 199 : 69) {} + unsigned c; +}; +B p ("a", "b"); -- 2.7.4