Commit d04a575f by Mark Mitchell Committed by Mark Mitchell

re PR c++/10147 (Confusing error message for invalid template function argument)

	PR c++/10147
	* call.c (initialize_reference): Tweak error message.

	PR c++/12337
	* init.c (build_new_1): Make sure that the expression returned is
	not an lvalue.

	PR c++/12344, c++/12236, c++/8656
	* decl.c (start_function): Do not ignore attributes embedded in a
	function declarator.

	PR c++/12337
	* g++.dg/init/new9.C: New test.

	PR c++/12334, c++/12236, c++/8656
	* g++.dg/ext/attrib8.C: New test.

From-SVN: r72183
parent be763023
2003-10-06 Mark Mitchell <mark@codesourcery.com> 2003-10-06 Mark Mitchell <mark@codesourcery.com>
PR c++/10147
* call.c (initialize_reference): Tweak error message.
* cxx-pretty-print.h (cxx_pretty_printer_flags): Remove
pp_cxx_flag_qualified_id and pp_cxx_flag_global_scope.
* cxx-pretty-print.c (pp_cxx_id_expression): Always display
qualified entities using qualified names.
PR c++/12337
* init.c (build_new_1): Make sure that the expression returned is
not an lvalue.
PR c++/12344, c++/12236, c++/8656
* decl.c (start_function): Do not ignore attributes embedded in a
function declarator.
2003-10-06 Mark Mitchell <mark@codesourcery.com>
* Make-lang.in (c++.info): Remove. * Make-lang.in (c++.info): Remove.
(c++.dvi): Remove. (c++.dvi): Remove.
(c++.generated-manpages): Replace with ... (c++.generated-manpages): Replace with ...
......
...@@ -6055,7 +6055,9 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup) ...@@ -6055,7 +6055,9 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
"type '%T' from a temporary of type '%T'", "type '%T' from a temporary of type '%T'",
type, TREE_TYPE (expr)); type, TREE_TYPE (expr));
else else
error ("could not convert `%E' to `%T'", expr, type); error ("invalid initialization of reference of type "
"'%T' from expression of type '%T'", type,
TREE_TYPE (expr));
return error_mark_node; return error_mark_node;
} }
......
...@@ -268,9 +268,7 @@ pp_cxx_id_expression (cxx_pretty_printer *pp, tree t) ...@@ -268,9 +268,7 @@ pp_cxx_id_expression (cxx_pretty_printer *pp, tree t)
{ {
if (TREE_CODE (t) == OVERLOAD) if (TREE_CODE (t) == OVERLOAD)
t = OVL_CURRENT (t); t = OVL_CURRENT (t);
if ((TREE_CODE (t) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (t)) if (DECL_P (t) && DECL_CONTEXT (t))
|| (pp_c_base (pp)->flags
& (pp_cxx_flag_qualified_id | pp_cxx_flag_global_scope)))
pp_cxx_qualified_id (pp, t); pp_cxx_qualified_id (pp, t);
else else
pp_cxx_unqualified_id (pp, t); pp_cxx_unqualified_id (pp, t);
......
...@@ -30,9 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -30,9 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
typedef enum typedef enum
{ {
/* Ask for an qualified-id. */ /* Ask for an qualified-id. */
pp_cxx_flag_qualified_id = 1 << pp_c_flag_last_bit, pp_cxx_flag_default_argument = 1 << pp_c_flag_last_bit
pp_cxx_flag_global_scope = 1 << (pp_c_flag_last_bit + 1),
pp_cxx_flag_default_argument = 1 << (pp_c_flag_last_bit + 2)
} cxx_pretty_printer_flags; } cxx_pretty_printer_flags;
......
...@@ -13135,7 +13135,7 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags) ...@@ -13135,7 +13135,7 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
} }
else else
{ {
decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, NULL); decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, &attrs);
/* If the declarator is not suitable for a function definition, /* If the declarator is not suitable for a function definition,
cause a syntax error. */ cause a syntax error. */
if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL)
......
...@@ -2276,7 +2276,13 @@ build_new_1 (tree exp) ...@@ -2276,7 +2276,13 @@ build_new_1 (tree exp)
} }
/* Convert to the final type. */ /* Convert to the final type. */
return build_nop (pointer_type, rval); rval = build_nop (pointer_type, rval);
/* A new-expression is never an lvalue. */
if (real_lvalue_p (rval))
rval = build1 (NON_LVALUE_EXPR, TREE_TYPE (rval), rval);
return rval;
} }
static tree static tree
......
2003-10-06 Mark Mitchell <mark@codesourcery.com>
PR c++/10147
* g++.dg/other/error4.C: Update error messages.
* g++.dg/template/ptrmem4.C: Likewise.
PR c++/12337
* g++.dg/init/new9.C: New test.
PR c++/12334, c++/12236, c++/8656
* g++.dg/ext/attrib8.C: New test.
2003-10-06 Devang Patel <dpatel@apple.com> 2003-10-06 Devang Patel <dpatel@apple.com>
* gcc.dg/debug/dwarf2-3.h: New test. * gcc.dg/debug/dwarf2-3.h: New test.
......
// PR 8656
extern int * (__attribute__((stdcall)) *fooPtr)( void);
int * __attribute__((stdcall)) myFn01( void) { return 0; }
void snafu( void)
{
fooPtr = myFn01;
}
// PR 12337
class A {};
template <typename T>
class X : public A {
public:
X(T&);
};
class B {
public:
bool foo(A*);
template <typename T>
bool foo(T& t) { return foo(new X<T>(t)); }
};
int main()
{
B x, y;
x.foo(y);
}
...@@ -11,5 +11,5 @@ void Foo(int const &); // { dg-error "in passing" "" } ...@@ -11,5 +11,5 @@ void Foo(int const &); // { dg-error "in passing" "" }
void Baz () void Baz ()
{ {
Foo (Wrapper ()); // { dg-error "convert `Wrapper *\\(\\)' to" "" } Foo (Wrapper ()); // { dg-error "Wrapper" "" }
} }
...@@ -16,5 +16,5 @@ struct SpyExample ...@@ -16,5 +16,5 @@ struct SpyExample
void SpyExample::ready() void SpyExample::ready()
{ {
queryAliases(inputs); // { dg-error "convert" } queryAliases(inputs); // { dg-error "" }
} }
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