Commit 61cd552e by Mark Mitchell Committed by Mark Mitchell

error.c (dump_function_decl): Don't print the argument types for a function when…

error.c (dump_function_decl): Don't print the argument types for a function when the verbosity level is negative.

	* error.c (dump_function_decl): Don't print the argument types for
	a function when the verbosity level is negative.
	* call.c (build_over_call): Check format attributes at call-time.
	* pt.c (tsubst_copy): Fix comment.
	(unify): Don't allow unification with variable-sized arrays.
	* semantics.c (finish_stmt_expr): When processing a template make
	the BIND_EXPR long-lived.

From-SVN: r24788
parent 876d1fa3
1999-01-20 Mark Mitchell <mark@markmitchell.com>
* error.c (dump_function_decl): Don't print the argument types for
a function when the verbosity level is negative.
* call.c (build_over_call): Check format attributes at call-time.
* pt.c (tsubst_copy): Fix comment.
(unify): Don't allow unification with variable-sized arrays.
* semantics.c (finish_stmt_expr): When processing a template make
the BIND_EXPR long-lived.
1999-01-19 Jason Merrill <jason@yorick.cygnus.com> 1999-01-19 Jason Merrill <jason@yorick.cygnus.com>
* decl2.c (finish_vtable_vardecl): Make vtables comdat here. * decl2.c (finish_vtable_vardecl): Make vtables comdat here.
......
...@@ -3364,6 +3364,10 @@ build_over_call (cand, args, flags) ...@@ -3364,6 +3364,10 @@ build_over_call (cand, args, flags)
converted_args = nreverse (converted_args); converted_args = nreverse (converted_args);
if (warn_format && (DECL_NAME (fn) || DECL_ASSEMBLER_NAME (fn)))
check_function_format (DECL_NAME (fn), DECL_ASSEMBLER_NAME (fn),
converted_args);
/* Avoid actually calling copy constructors and copy assignment operators, /* Avoid actually calling copy constructors and copy assignment operators,
if possible. */ if possible. */
......
...@@ -958,8 +958,9 @@ dump_decl (t, v) ...@@ -958,8 +958,9 @@ dump_decl (t, v)
} }
/* Pretty printing for announce_function. T is the declaration of the /* Pretty printing for announce_function. T is the declaration of the
function we are interested in seeing. V is non-zero if we should print function we are interested in seeing. If V is zero, we print the
the type that this function returns. */ argument types. If V is positive, we also print the return types.
If V is negative, we do not even print the argument types. */
static void static void
dump_function_decl (t, v) dump_function_decl (t, v)
...@@ -985,9 +986,8 @@ dump_function_decl (t, v) ...@@ -985,9 +986,8 @@ dump_function_decl (t, v)
else if (TREE_CODE (fntype) == METHOD_TYPE) else if (TREE_CODE (fntype) == METHOD_TYPE)
cname = TREE_TYPE (TREE_VALUE (parmtypes)); cname = TREE_TYPE (TREE_VALUE (parmtypes));
v = (v > 0); /* Print the return type. */
if (v > 0)
if (v)
{ {
if (DECL_STATIC_FUNCTION_P (t)) if (DECL_STATIC_FUNCTION_P (t))
OB_PUTS ("static "); OB_PUTS ("static ");
...@@ -1001,6 +1001,7 @@ dump_function_decl (t, v) ...@@ -1001,6 +1001,7 @@ dump_function_decl (t, v)
} }
} }
/* Print the function name. */
if (cname) if (cname)
{ {
dump_type (cname, 0); dump_type (cname, 0);
...@@ -1021,7 +1022,11 @@ dump_function_decl (t, v) ...@@ -1021,7 +1022,11 @@ dump_function_decl (t, v)
parmtypes = TREE_CHAIN (parmtypes); parmtypes = TREE_CHAIN (parmtypes);
dump_function_name (t); dump_function_name (t);
/* If V is negative, we don't print the argument types. */
if (v < 0)
return;
OB_PUTC ('('); OB_PUTC ('(');
if (parmtypes) if (parmtypes)
......
...@@ -6329,7 +6329,7 @@ tsubst_copy (t, args, in_decl) ...@@ -6329,7 +6329,7 @@ tsubst_copy (t, args, in_decl)
if (code == BIND_EXPR && !processing_template_decl) if (code == BIND_EXPR && !processing_template_decl)
{ {
/* This processing should really occur in tsubst_expr, /* This processing should really occur in tsubst_expr,
However, tsubst_expr does not recurse into expressions, However, tsubst_expr does not recurse into expressions,
since it assumes that there aren't any statements since it assumes that there aren't any statements
inside them. Instead, it simply calls inside them. Instead, it simply calls
...@@ -7504,6 +7504,20 @@ unify (tparms, targs, parm, arg, strict, explicit_mask) ...@@ -7504,6 +7504,20 @@ unify (tparms, targs, parm, arg, strict, explicit_mask)
return 0; return 0;
else if (targ) else if (targ)
return 1; return 1;
/* Make sure that ARG is not a variable-sized array. (Note that
were talking about variable-sized arrays (like `int[n]'),
rather than arrays of unknown size (like `int[]').) We'll
get very confused by such a type since the bound of the array
will not be computable in an instantiation. Besides, such
types are not allowed in ISO C++, so we can do as we please
here. */
if (TREE_CODE (arg) == ARRAY_TYPE
&& !uses_template_parms (arg)
&& (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (arg)))
!= INTEGER_CST))
return 1;
TREE_VEC_ELT (targs, idx) = arg; TREE_VEC_ELT (targs, idx) = arg;
return 0; return 0;
......
...@@ -809,8 +809,8 @@ finish_stmt_expr (rtl_expr, expr) ...@@ -809,8 +809,8 @@ finish_stmt_expr (rtl_expr, expr)
{ {
/* Make a BIND_EXPR for the BLOCK already made. */ /* Make a BIND_EXPR for the BLOCK already made. */
if (processing_template_decl) if (processing_template_decl)
result = build (BIND_EXPR, NULL_TREE, result = build_min_nt (BIND_EXPR, NULL_TREE, last_tree,
NULL_TREE, last_tree, expr); NULL_TREE);
else else
result = build (BIND_EXPR, TREE_TYPE (rtl_expr), result = build (BIND_EXPR, TREE_TYPE (rtl_expr),
NULL_TREE, rtl_expr, expr); NULL_TREE, rtl_expr, expr);
......
// Build don't link:
// Special g++ Options: -Wall
struct a
{
void x(char *f,...) __attribute__((format(printf,2,3)));
};
int main()
{
a A;
A.x("%d"); // WARNING - too few arguments for format
return 0;
}
// Build don't link:
template<int i> int f (void)
{
if (__extension__ ({ 1; }))
return 0;
return 1;
}
void g (void)
{
f<1> ();
}
// Build don't link:
// Special g++ Options:
template <class ARRY>
inline unsigned int asize(ARRY &a)
{
return sizeof(a) / sizeof(a[0]);
}
int f(unsigned int n) {
int x[n];
asize(x); // ERROR - no matching function
};
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