mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-28 22:11:21 +08:00
re PR c++/50972 ([C++0x] ICE on undeclared identifier)
PR c++/50972 * pt.c (maybe_instantiate_noexcept): Check the return value of push_tinst_level. From-SVN: r181240
This commit is contained in:
parent
59276295d6
commit
cb8010f922
@ -1,5 +1,9 @@
|
||||
2011-11-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/50972
|
||||
* pt.c (maybe_instantiate_noexcept): Check the return value of
|
||||
push_tinst_level.
|
||||
|
||||
PR c++/51046
|
||||
* parser.c (cp_parser_range_for): check_for_bare_parameter_packs.
|
||||
|
||||
|
27
gcc/cp/pt.c
27
gcc/cp/pt.c
@ -18166,17 +18166,22 @@ maybe_instantiate_noexcept (tree fn)
|
||||
|
||||
if (TREE_CODE (noex) == DEFERRED_NOEXCEPT)
|
||||
{
|
||||
push_tinst_level (fn);
|
||||
push_access_scope (fn);
|
||||
input_location = DECL_SOURCE_LOCATION (fn);
|
||||
noex = tsubst_copy_and_build (DEFERRED_NOEXCEPT_PATTERN (noex),
|
||||
DEFERRED_NOEXCEPT_ARGS (noex),
|
||||
tf_warning_or_error, fn, /*function_p=*/false,
|
||||
/*integral_constant_expression_p=*/true);
|
||||
pop_access_scope (fn);
|
||||
pop_tinst_level ();
|
||||
spec = build_noexcept_spec (noex, tf_warning_or_error);
|
||||
if (spec == error_mark_node)
|
||||
if (push_tinst_level (fn))
|
||||
{
|
||||
push_access_scope (fn);
|
||||
input_location = DECL_SOURCE_LOCATION (fn);
|
||||
noex = tsubst_copy_and_build (DEFERRED_NOEXCEPT_PATTERN (noex),
|
||||
DEFERRED_NOEXCEPT_ARGS (noex),
|
||||
tf_warning_or_error, fn,
|
||||
/*function_p=*/false,
|
||||
/*integral_constant_expression_p=*/true);
|
||||
pop_access_scope (fn);
|
||||
pop_tinst_level ();
|
||||
spec = build_noexcept_spec (noex, tf_warning_or_error);
|
||||
if (spec == error_mark_node)
|
||||
spec = noexcept_false_spec;
|
||||
}
|
||||
else
|
||||
spec = noexcept_false_spec;
|
||||
}
|
||||
else
|
||||
|
@ -1,5 +1,8 @@
|
||||
2011-11-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/50972
|
||||
* g++.dg/cpp0x/noexcept16.C: New.
|
||||
|
||||
PR c++/51046
|
||||
* g++.dg/cpp0x/variadic119.C: New.
|
||||
|
||||
|
130
gcc/testsuite/g++.dg/cpp0x/noexcept16.C
Normal file
130
gcc/testsuite/g++.dg/cpp0x/noexcept16.C
Normal file
@ -0,0 +1,130 @@
|
||||
// PR c++/50972
|
||||
// { dg-do compile { target c++11 } }
|
||||
// Ignore all errors, we're just testing that this doesn't ICE
|
||||
// { dg-prune-output "error" }
|
||||
|
||||
namespace std
|
||||
typedef long unsigned int size_t;
|
||||
template<typename...>
|
||||
struct __and_;
|
||||
template<typename _Tp>
|
||||
struct is_nothrow_move_constructible
|
||||
{
|
||||
};
|
||||
template<typename _Tp>
|
||||
struct is_nothrow_move_assignable
|
||||
struct __add_rvalue_reference_helper<_Tp, true>
|
||||
{ typedef _Tp&& type; };
|
||||
template<typename _Tp>
|
||||
struct add_rvalue_reference
|
||||
: public __add_rvalue_reference_helper<_Tp>
|
||||
{
|
||||
};
|
||||
template<typename _Tp>
|
||||
inline typename add_rvalue_reference<_Tp>::type
|
||||
declval() noexcept
|
||||
{
|
||||
}
|
||||
}
|
||||
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
|
||||
template<typename _Tp>
|
||||
class new_allocator
|
||||
{
|
||||
};
|
||||
}
|
||||
namespace std __attribute__ ((__visibility__ ("default")))
|
||||
class allocator: public __gnu_cxx::new_allocator<_Tp>
|
||||
{
|
||||
template<typename _Tp1>
|
||||
struct rebind
|
||||
{ typedef allocator<_Tp1> other; };
|
||||
};
|
||||
}
|
||||
namespace std __attribute__ ((__visibility__ ("default")))
|
||||
template<typename _Alloc, typename _Tp>
|
||||
struct __alloctr_rebind<_Alloc, _Tp, true>
|
||||
{
|
||||
typedef typename _Alloc::template rebind<_Tp>::other __type;
|
||||
};
|
||||
template<typename _Alloc>
|
||||
struct allocator_traits
|
||||
{
|
||||
template<typename _Tp>
|
||||
struct __rebind_alloc
|
||||
{
|
||||
typedef typename __alloctr_rebind<_Alloc, _Tp>::__type __type;
|
||||
};
|
||||
}
|
||||
}
|
||||
namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
|
||||
template<typename _Alloc>
|
||||
struct __alloc_traits
|
||||
{
|
||||
typedef std::allocator_traits<_Alloc> _Base_type;
|
||||
static constexpr bool _S_nothrow_swap()
|
||||
{
|
||||
return !_S_propagate_on_swap()
|
||||
|| noexcept(swap(std::declval<_Alloc&>(), std::declval<_Alloc&>()));
|
||||
}
|
||||
template<typename _Tp>
|
||||
struct rebind
|
||||
{ typedef typename _Base_type::template __rebind_alloc<_Tp>::__type other; };
|
||||
};
|
||||
}
|
||||
namespace std __attribute__ ((__visibility__ ("default")))
|
||||
template<typename _Tp, typename _Alloc>
|
||||
struct _Vector_base
|
||||
{
|
||||
typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
|
||||
rebind<_Tp>::other _Tp_alloc_type;
|
||||
};
|
||||
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
|
||||
class vector : protected _Vector_base<_Tp, _Alloc>
|
||||
{
|
||||
typedef _Vector_base<_Tp, _Alloc> _Base;
|
||||
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
|
||||
typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
|
||||
swap(vector& __x)
|
||||
noexcept(_Alloc_traits::_S_nothrow_swap());
|
||||
};
|
||||
}
|
||||
namespace lexertl
|
||||
namespace detail
|
||||
}
|
||||
namespace detail
|
||||
template<typename id_type>
|
||||
struct basic_internals
|
||||
{
|
||||
typedef std::vector<id_type> id_type_vector;
|
||||
};
|
||||
};
|
||||
template<typename char_type, typename id_type = std::size_t>
|
||||
class basic_state_machine
|
||||
{
|
||||
typedef detail::basic_internals<id_type> internals;
|
||||
void minimise ()
|
||||
{
|
||||
minimise_dfa (dfa_alphabet_, *dfa_, size_);
|
||||
}
|
||||
typedef typename internals::id_type_vector id_type_vector;
|
||||
void minimise_dfa (const id_type dfa_alphabet_,
|
||||
id_type_vector &dfa_, std::size_t size_)
|
||||
{
|
||||
id_type_vector new_dfa_ (front_, front_ + dfa_alphabet_);
|
||||
dfa_.swap (new_dfa_);
|
||||
}
|
||||
}
|
||||
}
|
||||
namespace std __attribute__ ((__visibility__ ("default")))
|
||||
template<typename _Tp>
|
||||
void
|
||||
swap(_Tp&, _Tp&)
|
||||
noexcept(__and_<is_nothrow_move_constructible<_Tp>,
|
||||
is_nothrow_move_assignable<_Tp>>::value)
|
||||
;
|
||||
typedef lexertl::basic_state_machine<char32_t> lexstate;
|
||||
lexstate m_state_machine;
|
||||
GenerateLexer()
|
||||
{
|
||||
m_state_machine.minimise();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user