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:
parent
029d01033f
commit
a502c82791
|
@ -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.
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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");
|
Loading…
Reference in New Issue