re PR c++/15337 (sizeof on incomplete type diagnostic)

PR c++/15337
	* error.c (c_sizeof_or_alignof_type): Use more detailed error
	message.

	PR c++/15766
	* parser.c (cp_parser_iteration_statement): Fix typo in error
	message.

	PR c++/14777
	* pt.c (tsubst_default_argument): Do not defer access checks
	while substituting into the default argument.

	PR c++/15554
	* pt.c (tsubst_copy): Do not try to substitute for an enumeration
	constant in a non-dependent context.

	PR c++/15057
	* except.c (build_throw): Ensure that temp_expr has been
	initialized.

	PR c++/15337
	* g++.dg/expr/sizeof3.C: New test.

	PR c++/14777
	* g++.dg/template/access14.C: New test.

	PR c++/15554
	* g++.dg/template/enum1.C: New test.

	PR c++/15057
	* g++.dg/eh/throw1.C: New test.

From-SVN: r82693
This commit is contained in:
Mark Mitchell 2004-06-07 15:54:15 +00:00 committed by Mark Mitchell
parent 0ab80019b6
commit d5a10cf069
11 changed files with 84 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2004-06-07 Mark Mitchell <mark@codesourcery.com>
PR c++/15337
* error.c (c_sizeof_or_alignof_type): Use more detailed error
message.
2004-06-06 Paolo Bonzini <bonzini@gnu.org>
* config.in: Regenerate.

View File

@ -3060,7 +3060,8 @@ c_sizeof_or_alignof_type (tree type, enum tree_code op, int complain)
else if (!COMPLETE_TYPE_P (type))
{
if (complain)
error ("invalid application of `%s' to an incomplete type", op_name);
error ("invalid application of `%s' to incomplete type `%T' ",
op_name, type);
value = size_zero_node;
}
else

View File

@ -1,3 +1,21 @@
2004-06-07 Mark Mitchell <mark@codesourcery.com>
PR c++/15766
* parser.c (cp_parser_iteration_statement): Fix typo in error
message.
PR c++/14777
* pt.c (tsubst_default_argument): Do not defer access checks
while substituting into the default argument.
PR c++/15554
* pt.c (tsubst_copy): Do not try to substitute for an enumeration
constant in a non-dependent context.
PR c++/15057
* except.c (build_throw): Ensure that temp_expr has been
initialized.
2004-06-06 Roger Sayle <roger@eyesopen.com>
* cp/cp-tree.h (lvalue_or_else): Add function prototype.

View File

@ -684,6 +684,7 @@ build_throw (tree exp)
because it will only return false in cases where elided is true,
and therefore we don't need to work around the failure to
preevaluate. */
temp_expr = NULL_TREE;
stabilize_init (exp, &temp_expr);
if (elided)

View File

@ -6138,8 +6138,8 @@ cp_parser_iteration_statement (cp_parser* parser)
expression = cp_parser_expression (parser);
finish_for_expr (expression, statement);
/* Look for the `)'. */
cp_parser_require (parser, CPP_CLOSE_PAREN, "`;'");
cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
/* Parse the body of the for-statement. */
parser->in_iteration_statement_p = true;
cp_parser_already_scoped_statement (parser);

View File

@ -5895,22 +5895,18 @@ tsubst_default_argument (tree fn, tree type, tree arg)
};
we must be careful to do name lookup in the scope of S<T>,
rather than in the current class.
??? current_class_type affects a lot more than name lookup. This is
very fragile. Fortunately, it will go away when we do 2-phase name
binding properly. */
/* FN is already the desired FUNCTION_DECL. */
rather than in the current class. */
push_access_scope (fn);
/* The default argument expression should not be considered to be
within the scope of FN. Since push_access_scope sets
current_function_decl, we must explicitly clear it here. */
current_function_decl = NULL_TREE;
push_deferring_access_checks(dk_no_deferred);
arg = tsubst_expr (arg, DECL_TI_ARGS (fn),
tf_error | tf_warning, NULL_TREE);
pop_deferring_access_checks();
pop_access_scope (fn);
/* Make sure the default argument is reasonable. */
@ -7423,6 +7419,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
enumerators. */
if (DECL_NAMESPACE_SCOPE_P (t))
return t;
/* If ARGS is NULL, then T is known to be non-dependent. */
if (args == NULL_TREE)
return t;
/* Unfortunately, we cannot just call lookup_name here.
Consider:

View File

@ -1,3 +1,17 @@
2004-06-07 Mark Mitchell <mark@codesourcery.com>
PR c++/15337
* g++.dg/expr/sizeof3.C: New test.
PR c++/14777
* g++.dg/template/access14.C: New test.
PR c++/15554
* g++.dg/template/enum1.C: New test.
PR c++/15057
* g++.dg/eh/throw1.C: New test.
2004-06-07 David Ayers <d.ayers@inode.at>
Ziemowit Laski <zlaski@apple.com>

View File

@ -0,0 +1,9 @@
class S
{
public:
S(){}
};
int foo(char* m1) {
throw (m1 ? S() : S());
}

View File

@ -0,0 +1,4 @@
// PR c++/15337
class CCC;
int main() { sizeof(CCC); return 0; } // { dg-error ".*CCC.*" }

View File

@ -0,0 +1,16 @@
// PR c++/14777
template <typename T>
struct B
{
protected:
typedef int M;
};
template <typename T>
struct A : B<T> {
typedef typename B<T>::M N;
A (int = N ());
};
A<int> a = A<int> ();

View File

@ -0,0 +1,5 @@
// PR c++/15554
template <int n> struct T1 { enum { N = 3 }; };
template <int n> struct T2 { enum { N = 3, N1 = T1<N>::N }; };