re PR c++/57047 ([C++11] stl_pair.h:137:64: internal compiler error: Segmentation fault in constexpr constructor)

PR c++/57047
	* semantics.c (cxx_fold_indirect_ref): Fix thinko.

From-SVN: r198779
This commit is contained in:
Jason Merrill 2013-05-10 10:34:24 -04:00 committed by Jason Merrill
parent 029d01033f
commit a502c82791
3 changed files with 64 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2013-05-09 Jason Merrill <jason@redhat.com>
PR c++/57047
* semantics.c (cxx_fold_indirect_ref): Fix thinko.
2013-04-21 Eric Botcazou <ebotcazou@adacore.com>
* parser.c (cp_parser_late_return_type_opt): Fix C++ism.

View File

@ -7412,15 +7412,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))

View File

@ -0,0 +1,54 @@
// PR c++/57047
// { dg-require-effective-target c++11 }
template <typename>
struct A;
template <typename T>
struct A <T &>
{
typedef T type;
};
template <typename T>
constexpr T && foo (typename A <T>::type & __t) noexcept
{
return static_cast <T &&>(__t);
}
template <class T1, class T2>
struct B
{
T1 t1;
T2 t2;
template <class U>
constexpr B (U && __x, const T2 & __y) : t1 (foo <U> (__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 <C, C> p ("a", "b");