Commit d5a10cf0 by Mark Mitchell Committed by Mark Mitchell

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
parent 0ab80019
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> 2004-06-06 Paolo Bonzini <bonzini@gnu.org>
* config.in: Regenerate. * config.in: Regenerate.
......
...@@ -3060,7 +3060,8 @@ c_sizeof_or_alignof_type (tree type, enum tree_code op, int complain) ...@@ -3060,7 +3060,8 @@ c_sizeof_or_alignof_type (tree type, enum tree_code op, int complain)
else if (!COMPLETE_TYPE_P (type)) else if (!COMPLETE_TYPE_P (type))
{ {
if (complain) 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; value = size_zero_node;
} }
else else
......
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> 2004-06-06 Roger Sayle <roger@eyesopen.com>
* cp/cp-tree.h (lvalue_or_else): Add function prototype. * cp/cp-tree.h (lvalue_or_else): Add function prototype.
......
...@@ -684,6 +684,7 @@ build_throw (tree exp) ...@@ -684,6 +684,7 @@ build_throw (tree exp)
because it will only return false in cases where elided is true, because it will only return false in cases where elided is true,
and therefore we don't need to work around the failure to and therefore we don't need to work around the failure to
preevaluate. */ preevaluate. */
temp_expr = NULL_TREE;
stabilize_init (exp, &temp_expr); stabilize_init (exp, &temp_expr);
if (elided) if (elided)
......
...@@ -6138,8 +6138,8 @@ cp_parser_iteration_statement (cp_parser* parser) ...@@ -6138,8 +6138,8 @@ cp_parser_iteration_statement (cp_parser* parser)
expression = cp_parser_expression (parser); expression = cp_parser_expression (parser);
finish_for_expr (expression, statement); finish_for_expr (expression, statement);
/* Look for the `)'. */ /* Look for the `)'. */
cp_parser_require (parser, CPP_CLOSE_PAREN, "`;'"); cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
/* Parse the body of the for-statement. */ /* Parse the body of the for-statement. */
parser->in_iteration_statement_p = true; parser->in_iteration_statement_p = true;
cp_parser_already_scoped_statement (parser); cp_parser_already_scoped_statement (parser);
......
...@@ -5895,22 +5895,18 @@ tsubst_default_argument (tree fn, tree type, tree arg) ...@@ -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>, we must be careful to do name lookup in the scope of S<T>,
rather than in the current class. 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. */
push_access_scope (fn); push_access_scope (fn);
/* The default argument expression should not be considered to be /* The default argument expression should not be considered to be
within the scope of FN. Since push_access_scope sets within the scope of FN. Since push_access_scope sets
current_function_decl, we must explicitly clear it here. */ current_function_decl, we must explicitly clear it here. */
current_function_decl = NULL_TREE; current_function_decl = NULL_TREE;
push_deferring_access_checks(dk_no_deferred);
arg = tsubst_expr (arg, DECL_TI_ARGS (fn), arg = tsubst_expr (arg, DECL_TI_ARGS (fn),
tf_error | tf_warning, NULL_TREE); tf_error | tf_warning, NULL_TREE);
pop_deferring_access_checks();
pop_access_scope (fn); pop_access_scope (fn);
/* Make sure the default argument is reasonable. */ /* Make sure the default argument is reasonable. */
...@@ -7423,6 +7419,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -7423,6 +7419,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
enumerators. */ enumerators. */
if (DECL_NAMESPACE_SCOPE_P (t)) if (DECL_NAMESPACE_SCOPE_P (t))
return 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. /* Unfortunately, we cannot just call lookup_name here.
Consider: Consider:
......
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> 2004-06-07 David Ayers <d.ayers@inode.at>
Ziemowit Laski <zlaski@apple.com> Ziemowit Laski <zlaski@apple.com>
......
class S
{
public:
S(){}
};
int foo(char* m1) {
throw (m1 ? S() : S());
}
// PR c++/15337
class CCC;
int main() { sizeof(CCC); return 0; } // { dg-error ".*CCC.*" }
// 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> ();
// PR c++/15554
template <int n> struct T1 { enum { N = 3 }; };
template <int n> struct T2 { enum { N = 3, N1 = T1<N>::N }; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment