re PR c++/11525 (ICE/segfault on C++ code)

cp:
	PR c++/11525
	* parser.c (cp_parser_primary_expression): Do not set
	non-constant-p merely because it is a dependent scope.
testsuite:
	PR c++/11525
	* g++.dg/parse/constant4.C: New test.

From-SVN: r70041
This commit is contained in:
Nathan Sidwell 2003-08-01 09:10:29 +00:00 committed by Nathan Sidwell
parent 2fdd01a09a
commit f21e6028bf
4 changed files with 47 additions and 5 deletions

View File

@ -1,5 +1,9 @@
2003-08-01 Nathan Sidwell <nathan@codesourcery.com> 2003-08-01 Nathan Sidwell <nathan@codesourcery.com>
PR c++/11525
* parser.c (cp_parser_primary_expression): Do not set
non-constant-p merely because it is a dependent scope.
PR c++/9447 PR c++/9447
* decl2.c (do_class_using_decl): Set type to NULL_TREE. * decl2.c (do_class_using_decl): Set type to NULL_TREE.
* semantics.c (finish_expr_stmt): Do not convert to void in a * semantics.c (finish_expr_stmt): Do not convert to void in a

View File

@ -2394,11 +2394,6 @@ cp_parser_primary_expression (cp_parser *parser,
{ {
if (TYPE_P (TREE_OPERAND (decl, 0))) if (TYPE_P (TREE_OPERAND (decl, 0)))
*qualifying_class = TREE_OPERAND (decl, 0); *qualifying_class = TREE_OPERAND (decl, 0);
/* Since this name was dependent, the expression isn't
constant -- yet. No error is issued because it
might be constant when things are instantiated. */
if (parser->constant_expression_p)
parser->non_constant_expression_p = true;
return decl; return decl;
} }
/* Check to see if DECL is a local variable in a context /* Check to see if DECL is a local variable in a context

View File

@ -1,5 +1,8 @@
2003-08-01 Nathan Sidwell <nathan@codesourcery.com> 2003-08-01 Nathan Sidwell <nathan@codesourcery.com>
PR c++/11525
* g++.dg/parse/constant4.C: New test.
PR c++/9447 PR c++/9447
* g++.dg/template/using5.C: New test. * g++.dg/template/using5.C: New test.

View File

@ -0,0 +1,40 @@
// { dg-do compile }
// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com>
// PR c++/11525 incorrect error about non-constant initalizer
template<typename> class X;
template<unsigned> class Y {};
template<typename T>
void Foo ()
{
static const unsigned I = X<T>::I;
Y<I> i;
static const unsigned J = X<T>::J;
Y<J> j; // { dg-error "non-constant" "" }
}
struct A
{
operator unsigned () const;
};
template <typename> struct X
{
enum {I};
static A const J;
};
void Baz ()
{
Foo<int> (); // { dg-error "instantiated" "" }
}