This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH: Named return values
- To: gcc-patches at gcc dot gnu dot org
- Subject: C++ PATCH: Named return values
- From: Mark Mitchell <mark at codesourcery dot com>
- Date: Wed, 06 Sep 2000 14:21:44 -0700
- Organization: CodeSourcery, LLC
This patch does two things:
- As agreed by Jason and myself, the named return value extension
will be deprecated in GCC 3.0, and removed at some later date.
This patch causes the appropriate warnings to be emitted, updates
the NEWS file, etc.
- In addition, named return values probably weren't being handled
right in all cases; one of the key invariants of
function-at-a-time mode (semantic analysis during RTL generation)
was being violated. Fixed with this patch.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
2000-09-06 Mark Mitchell <mark@codesourcery.com>
* NEWS: Mention that the named return value extension has been
deprecated.
* cp-tree.h (original_result_rtx): Define.
(TREE_REFERENCE_EXPR): Remove.
(DECL_VPARENT): Likewise.
(pushdecl_nonclass_level): Likewise.
(store_return_init): Likewise.
(reinit_lang_specific): Likewise.
(genrtl_named_return_value): Change prototype.
* decl.c (original_result_rtx): Remove.
(cp_finish_decl): Don't build DECL_STMTs for RESULT_DECLs.
Do not generate RTL for local variables here.
(store_return_init): Remove.
* semantics.c (genrtl_named_return_value): Simplify. Fold in
store_return_init.
(finish_named_return_value): Adjust accordingly. Warn that this
extension is deprecated.
(lang_expand_stmt): Adjust call to genrtl_named_return_value.
Index: extend.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/extend.texi,v
retrieving revision 1.62
diff -c -p -r1.62 extend.texi
*** extend.texi 2000/08/11 13:42:32 1.62
--- extend.texi 2000/09/06 21:14:49
*************** Previously it was possible to use an emp
*** 3333,3341 ****
indicate an unspecified number of parameters (like C), rather than no
parameters, as C++ demands. This feature has been removed, except where
it is required for backwards compatibility @xref{Backwards Compatibility}.
-
@end table
@node Backwards Compatibility
@section Backwards Compatibility
@cindex Backwards Compatibility
--- 3333,3343 ----
indicate an unspecified number of parameters (like C), rather than no
parameters, as C++ demands. This feature has been removed, except where
it is required for backwards compatibility @xref{Backwards Compatibility}.
@end table
+ The named return value extension has been deprecated, and will be
+ removed from g++ at some point.
+
@node Backwards Compatibility
@section Backwards Compatibility
@cindex Backwards Compatibility
*************** test specifically for GNU C++ (@pxref{St
*** 3379,3385 ****
Predefined Macros,cpp.info,The C Preprocessor}).
@menu
- * Naming Results:: Giving a name to C++ function return values.
* Min and Max:: C++ Minimum and maximum operators.
* Volatiles:: What constitutes an access to a volatile object.
* Restricted Pointers:: C99 restricted pointers and references.
--- 3381,3386 ----
*************** Predefined Macros,cpp.info,The C Preproc
*** 3390,3508 ****
* Bound member functions:: You can extract a function pointer to the
method denoted by a @samp{->*} or @samp{.*} expression.
@end menu
-
- @node Naming Results
- @section Named Return Values in C++
-
- @cindex @code{return}, in C++ function header
- @cindex return value, named, in C++
- @cindex named return value in C++
- @cindex C++ named return value
- GNU C++ extends the function-definition syntax to allow you to specify a
- name for the result of a function outside the body of the definition, in
- C++ programs:
-
- @example
- @group
- @var{type}
- @var{functionname} (@var{args}) return @var{resultname};
- @{
- @dots{}
- @var{body}
- @dots{}
- @}
- @end group
- @end example
-
- You can use this feature to avoid an extra constructor call when
- a function result has a class type. For example, consider a function
- @code{m}, declared as @w{@samp{X v = m ();}}, whose result is of class
- @code{X}:
-
- @example
- X
- m ()
- @{
- X b;
- b.a = 23;
- return b;
- @}
- @end example
-
- @cindex implicit argument: return value
- Although @code{m} appears to have no arguments, in fact it has one implicit
- argument: the address of the return value. At invocation, the address
- of enough space to hold @code{v} is sent in as the implicit argument.
- Then @code{b} is constructed and its @code{a} field is set to the value
- 23. Finally, a copy constructor (a constructor of the form @samp{X(X&)})
- is applied to @code{b}, with the (implicit) return value location as the
- target, so that @code{v} is now bound to the return value.
-
- But this is wasteful. The local @code{b} is declared just to hold
- something that will be copied right out. While a compiler that
- combined an ``elision'' algorithm with interprocedural data flow
- analysis could conceivably eliminate all of this, it is much more
- practical to allow you to assist the compiler in generating
- efficient code by manipulating the return value explicitly,
- thus avoiding the local variable and copy constructor altogether.
-
- Using the extended GNU C++ function-definition syntax, you can avoid the
- temporary allocation and copying by naming @code{r} as your return value
- at the outset, and assigning to its @code{a} field directly:
-
- @example
- X
- m () return r;
- @{
- r.a = 23;
- @}
- @end example
-
- @noindent
- The declaration of @code{r} is a standard, proper declaration, whose effects
- are executed @strong{before} any of the body of @code{m}.
-
- Functions of this type impose no additional restrictions; in particular,
- you can execute @code{return} statements, or return implicitly by
- reaching the end of the function body (``falling off the edge'').
- Cases like
-
- @example
- X
- m () return r (23);
- @{
- return;
- @}
- @end example
-
- @noindent
- (or even @w{@samp{X m () return r (23); @{ @}}}) are unambiguous, since
- the return value @code{r} has been initialized in either case. The
- following code may be hard to read, but also works predictably:
-
- @example
- X
- m () return r;
- @{
- X b;
- return b;
- @}
- @end example
-
- The return value slot denoted by @code{r} is initialized at the outset,
- but the statement @samp{return b;} overrides this value. The compiler
- deals with this by destroying @code{r} (calling the destructor if there
- is one, or doing nothing if there is not), and then reinitializing
- @code{r} with @code{b}.
-
- This extension is provided primarily to help people who use overloaded
- operators, where there is a great need to control not just the
- arguments, but the return values of functions. For classes where the
- copy constructor incurs a heavy performance penalty (especially in the
- common case where there is a quick default constructor), this is a major
- savings. The disadvantage of this extension is that you do not control
- when the default constructor for the return value is called: it is
- always called at the beginning.
@node Min and Max
@section Minimum and Maximum Operators in C++
--- 3391,3396 ----
Index: cp/NEWS
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/NEWS,v
retrieving revision 1.24
diff -c -p -r1.24 NEWS
*** NEWS 2000/05/31 19:27:11 1.24
--- NEWS 2000/09/06 21:14:50
***************
*** 36,41 ****
--- 36,47 ----
* G++ no longer allows you to overload the conditional operator (i.e.,
the `?:' operator.)
+ * The "named return value" extension:
+
+ int f () return r { r = 3; }
+
+ has been deprecated, and will be removed in a future version of G++.
+
*** Changes in GCC 2.95:
* Messages about non-conformant code that we can still handle ("pedwarns")
Index: cp/cp-tree.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/cp-tree.h,v
retrieving revision 1.522
diff -c -p -r1.522 cp-tree.h
*** cp-tree.h 2000/09/06 05:52:51 1.522
--- cp-tree.h 2000/09/06 21:14:53
*************** struct language_function
*** 1009,1014 ****
--- 1009,1021 ----
#define doing_semantic_analysis_p() (!expanding_p)
+ /* If original DECL_RESULT of current function was a register,
+ but due to being an addressable named return value, would up
+ on the stack, this variable holds the named return value's
+ original location. */
+
+ #define original_result_rtx cp_function_chain->x_result_rtx
+
#define in_function_try_handler cp_function_chain->in_function_try_handler
extern tree current_function_return_value;
*************** extern int flag_new_for_scope;
*** 2588,2600 ****
&& CONSTRUCTOR_ELTS (NODE) == NULL_TREE \
&& ! TREE_HAS_CONSTRUCTOR (NODE))
- #if 0
- /* Indicates that a NON_LVALUE_EXPR came from a C++ reference.
- Used to generate more helpful error message in case somebody
- tries to take its address. */
- #define TREE_REFERENCE_EXPR(NODE) (TREE_LANG_FLAG_3(NODE))
- #endif
-
/* Nonzero for _TYPE means that the _TYPE defines a destructor. */
#define TYPE_HAS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_2(NODE))
--- 2595,2600 ----
*************** extern int flag_new_for_scope;
*** 2804,2821 ****
/* Define fields and accessors for nodes representing declared names. */
- #if 0
- /* C++: A derived class may be able to directly use the virtual
- function table of a base class. When it does so, it may
- still have a decl node used to access the virtual function
- table (so that variables of this type can initialize their
- virtual function table pointers by name). When such thievery
- is committed, know exactly which base class's virtual function
- table is the one being stolen. This effectively computes the
- transitive closure. */
- #define DECL_VPARENT(NODE) ((NODE)->decl.arguments)
- #endif
-
#define TYPE_WAS_ANONYMOUS(NODE) (TYPE_LANG_SPECIFIC (NODE)->was_anonymous)
/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */
--- 2804,2809 ----
*************** extern int duplicate_decls PARAMS ((tr
*** 3903,3911 ****
extern tree pushdecl PARAMS ((tree));
extern tree pushdecl_top_level PARAMS ((tree));
extern void pushdecl_class_level PARAMS ((tree));
- #if 0
- extern void pushdecl_nonclass_level PARAMS ((tree));
- #endif
extern tree pushdecl_namespace_level PARAMS ((tree));
extern tree push_using_decl PARAMS ((tree, tree));
extern tree push_using_directive PARAMS ((tree));
--- 3891,3896 ----
*************** extern void check_goto PARAMS ((tree)
*** 3918,3926 ****
extern void define_case_label PARAMS ((void));
extern tree getdecls PARAMS ((void));
extern tree gettags PARAMS ((void));
- #if 0
- extern void set_current_level_tags_transparency PARAMS ((int));
- #endif
extern tree binding_for_name PARAMS ((tree, tree));
extern tree namespace_binding PARAMS ((tree, tree));
extern void set_namespace_binding PARAMS ((tree, tree, tree));
--- 3903,3908 ----
*************** extern void build_enumerator PARAMS ((
*** 3974,3980 ****
extern int start_function PARAMS ((tree, tree, tree, int));
extern void expand_start_early_try_stmts PARAMS ((void));
extern void store_parm_decls PARAMS ((void));
- extern void store_return_init PARAMS ((tree));
extern tree finish_function PARAMS ((int));
extern tree start_method PARAMS ((tree, tree, tree));
extern tree finish_method PARAMS ((tree));
--- 3956,3961 ----
*************** extern tree make_call_declarator PARAMS
*** 4166,4174 ****
extern void set_quals_and_spec PARAMS ((tree, tree, tree));
extern void lang_init PARAMS ((void));
extern void lang_finish PARAMS ((void));
- #if 0
- extern void reinit_lang_specific PARAMS ((void));
- #endif
extern void print_parse_statistics PARAMS ((void));
extern void extract_interface_info PARAMS ((void));
extern void do_pending_inlines PARAMS ((void));
--- 4147,4152 ----
*************** extern void genrtl_ctor_stmt
*** 4464,4471 ****
extern void genrtl_subobject PARAMS ((tree));
extern tree genrtl_do_poplevel PARAMS ((void));
extern void clear_out_block PARAMS ((void));
! extern void genrtl_named_return_value PARAMS ((tree,
! tree));
extern tree begin_global_stmt_expr PARAMS ((void));
extern tree finish_global_stmt_expr PARAMS ((tree));
--- 4442,4448 ----
extern void genrtl_subobject PARAMS ((tree));
extern tree genrtl_do_poplevel PARAMS ((void));
extern void clear_out_block PARAMS ((void));
! extern void genrtl_named_return_value PARAMS ((void));
extern tree begin_global_stmt_expr PARAMS ((void));
extern tree finish_global_stmt_expr PARAMS ((tree));
Index: cp/decl.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/decl.c,v
retrieving revision 1.682
diff -c -p -r1.682 decl.c
*** decl.c 2000/09/06 08:53:44 1.682
--- decl.c 2000/09/06 21:15:02
*************** int in_std;
*** 269,281 ****
/* Expect only namespace names now. */
static int only_namespace_names;
- /* If original DECL_RESULT of current function was a register,
- but due to being an addressable named return value, would up
- on the stack, this variable holds the named return value's
- original location. */
-
- #define original_result_rtx cp_function_chain->x_result_rtx
-
/* Used only for jumps to as-yet undefined labels, since jumps to
defined labels can have their validity checked immediately. */
--- 269,274 ----
*************** cp_finish_decl (decl, init, asmspec_tree
*** 8092,8098 ****
return;
/* Add this declaration to the statement-tree. */
! if (building_stmt_tree () && at_function_scope_p ())
add_decl_stmt (decl);
if (TYPE_HAS_MUTABLE_P (type))
--- 8085,8093 ----
return;
/* Add this declaration to the statement-tree. */
! if (building_stmt_tree ()
! && at_function_scope_p ()
! && TREE_CODE (decl) != RESULT_DECL)
add_decl_stmt (decl);
if (TYPE_HAS_MUTABLE_P (type))
*************** cp_finish_decl (decl, init, asmspec_tree
*** 8215,8222 ****
{
/* If we're not building RTL, then we need to do so
now. */
! if (!building_stmt_tree ())
! emit_local_var (decl);
/* Initialize the variable. */
initialize_local_var (decl, init, flags);
/* Clean up the variable. */
--- 8210,8216 ----
{
/* If we're not building RTL, then we need to do so
now. */
! my_friendly_assert (building_stmt_tree (), 20000906);
/* Initialize the variable. */
initialize_local_var (decl, init, flags);
/* Clean up the variable. */
*************** store_parm_decls ()
*** 14032,14062 ****
&& building_stmt_tree ()
&& TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
current_eh_spec_try_block = expand_start_eh_spec ();
- }
-
- /* Bind a name and initialization to the return value of
- the current function. */
-
- void
- store_return_init (decl)
- tree decl;
- {
- /* If this named return value comes in a register, put it in a
- pseudo-register. */
- if (DECL_REGISTER (decl))
- {
- original_result_rtx = DECL_RTL (decl);
- /* Note that the mode of the old DECL_RTL may be wider than the
- mode of DECL_RESULT, depending on the calling conventions for
- the processor. For example, on the Alpha, a 32-bit integer
- is returned in a DImode register -- the DECL_RESULT has
- SImode but the DECL_RTL for the DECL_RESULT has DImode. So,
- here, we use the mode the back-end has already assigned for
- the return value. */
- DECL_RTL (decl) = gen_reg_rtx (GET_MODE (original_result_rtx));
- if (TREE_ADDRESSABLE (decl))
- put_var_into_stack (decl);
- }
}
--- 14026,14031 ----
Index: cp/semantics.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/semantics.c,v
retrieving revision 1.167
diff -c -p -r1.167 semantics.c
*** semantics.c 2000/09/06 05:52:51 1.167
--- semantics.c 2000/09/06 21:15:04
*************** finish_decl_cleanup (decl, cleanup)
*** 1030,1084 ****
/* Generate the RTL for a RETURN_INIT. */
void
! genrtl_named_return_value (return_id, init)
! tree return_id, init;
{
tree decl;
- /* Clear this out so that finish_named_return_value can set it
- again. */
- DECL_NAME (DECL_RESULT (current_function_decl)) = NULL_TREE;
decl = DECL_RESULT (current_function_decl);
- if (pedantic)
- /* Give this error as many times as there are occurrences,
- so that users can use Emacs compilation buffers to find
- and fix all such places. */
- pedwarn ("ISO C++ does not permit named return values");
-
- if (return_id != NULL_TREE)
- {
- if (DECL_NAME (decl) == NULL_TREE)
- {
- DECL_NAME (decl) = return_id;
- DECL_ASSEMBLER_NAME (decl) = return_id;
- }
- else
- {
- cp_error ("return identifier `%D' already in place", return_id);
- return;
- }
- }
! /* Can't let this happen for constructors. */
! if (DECL_CONSTRUCTOR_P (current_function_decl))
! {
! error ("can't redefine default return value for constructors");
! return;
! }
! /* If we have a named return value, put that in our scope as well. */
! if (DECL_NAME (decl) != NULL_TREE)
! {
! /* Let `cp_finish_decl' know that this initializer is ok. */
! DECL_INITIAL (decl) = init;
! cp_finish_decl (decl, init, NULL_TREE, 0);
! store_return_init (decl);
}
-
- /* Don't use tree-inlining for functions with named return values.
- That doesn't work properly because we don't do any translation of
- the RETURN_INITs when they are copied. */
- DECL_UNINLINABLE (current_function_decl) = 1;
}
/* Bind a name and initialization to the return value of
--- 1030,1059 ----
/* Generate the RTL for a RETURN_INIT. */
void
! genrtl_named_return_value ()
{
tree decl;
decl = DECL_RESULT (current_function_decl);
! emit_local_var (decl);
! /* If this named return value comes in a register, put it in a
! pseudo-register. */
! if (DECL_REGISTER (decl))
! {
! original_result_rtx = DECL_RTL (decl);
! /* Note that the mode of the old DECL_RTL may be wider than the
! mode of DECL_RESULT, depending on the calling conventions for
! the processor. For example, on the Alpha, a 32-bit integer
! is returned in a DImode register -- the DECL_RESULT has
! SImode but the DECL_RTL for the DECL_RESULT has DImode. So,
! here, we use the mode the back-end has already assigned for
! the return value. */
! DECL_RTL (decl) = gen_reg_rtx (GET_MODE (original_result_rtx));
! if (TREE_ADDRESSABLE (decl))
! put_var_into_stack (decl);
}
}
/* Bind a name and initialization to the return value of
*************** finish_named_return_value (return_id, in
*** 1090,1100 ****
{
tree decl = DECL_RESULT (current_function_decl);
if (pedantic)
- /* Give this error as many times as there are occurrences,
- so that users can use Emacs compilation buffers to find
- and fix all such places. */
pedwarn ("ISO C++ does not permit named return values");
if (return_id != NULL_TREE)
{
--- 1065,1076 ----
{
tree decl = DECL_RESULT (current_function_decl);
+ /* Give this error as many times as there are occurrences, so that
+ users can use Emacs compilation buffers to find and fix all such
+ places. */
if (pedantic)
pedwarn ("ISO C++ does not permit named return values");
+ cp_deprecated ("the named return value extension");
if (return_id != NULL_TREE)
{
*************** finish_named_return_value (return_id, in
*** 1124,1130 ****
DECL_INITIAL (decl) = init;
if (doing_semantic_analysis_p ())
pushdecl (decl);
! add_tree (build_stmt (RETURN_INIT, return_id, init));
}
/* Don't use tree-inlining for functions with named return values.
--- 1100,1112 ----
DECL_INITIAL (decl) = init;
if (doing_semantic_analysis_p ())
pushdecl (decl);
! if (!processing_template_decl)
! {
! cp_finish_decl (decl, init, NULL_TREE, 0);
! add_tree (build_stmt (RETURN_INIT, NULL_TREE, NULL_TREE));
! }
! else
! add_tree (build_stmt (RETURN_INIT, return_id, init));
}
/* Don't use tree-inlining for functions with named return values.
*************** lang_expand_stmt (t)
*** 2463,2470 ****
break;
case RETURN_INIT:
! genrtl_named_return_value (TREE_OPERAND (t, 0),
! TREE_OPERAND (t, 1));
break;
default:
--- 2445,2451 ----
break;
case RETURN_INIT:
! genrtl_named_return_value ();
break;
default:
Index: testsuite/g++.old-deja/g++.benjamin/p13417.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.benjamin/p13417.C,v
retrieving revision 1.2
diff -c -p -r1.2 p13417.C
*** p13417.C 1998/12/16 21:22:08 1.2
--- p13417.C 2000/09/06 21:15:04
***************
*** 1,5 ****
// Build don't link:
! // Special g++ Options:
// prms-id: 13417
class Foo {
--- 1,5 ----
// Build don't link:
! // Special g++ Options: -Wno-deprecated
// prms-id: 13417
class Foo {
Index: testsuite/g++.old-deja/g++.ext/return1.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.ext/return1.C,v
retrieving revision 1.2
diff -c -p -r1.2 return1.C
*** return1.C 2000/06/02 18:19:02 1.2
--- return1.C 2000/09/06 21:15:04
***************
*** 1,6 ****
// Test that the named return value extension works when passed as a reference.
// Origin: Jason Merrill <jason@redhat.com>
! // Special g++ Options:
void f (int &i)
{
--- 1,6 ----
// Test that the named return value extension works when passed as a reference.
// Origin: Jason Merrill <jason@redhat.com>
! // Special g++ Options: -Wno-deprecated
void f (int &i)
{
Index: testsuite/g++.old-deja/g++.mike/p646.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.mike/p646.C,v
retrieving revision 1.4
diff -c -p -r1.4 p646.C
*** p646.C 2000/07/04 07:47:10 1.4
--- p646.C 2000/09/06 21:15:05
***************
*** 6,12 ****
*/
! // Special g++ Options:
extern "C"
{
--- 6,12 ----
*/
! // Special g++ Options: -Wno-deprecated
extern "C"
{
Index: testsuite/g++.old-deja/g++.mike/p700.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.mike/p700.C,v
retrieving revision 1.4
diff -c -p -r1.4 p700.C
*** p700.C 2000/07/25 20:11:43 1.4
--- p700.C 2000/09/06 21:15:05
***************
*** 1,4 ****
! // Special g++ Options:
// prms-id: 700
//# 1 "../../../../libg++/etc/benchmarks/dhrystone.cc"
--- 1,4 ----
! // Special g++ Options: -Wno-deprecated
// prms-id: 700
//# 1 "../../../../libg++/etc/benchmarks/dhrystone.cc"
Index: testsuite/g++.old-deja/g++.oliva/nameret1.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.oliva/nameret1.C,v
retrieving revision 1.2
diff -c -p -r1.2 nameret1.C
*** nameret1.C 1999/12/26 15:28:17 1.2
--- nameret1.C 2000/09/06 21:15:06
***************
*** 1,11 ****
// Build don't link:
! // Copyright (C) 1999 Free Software Foundation
// by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
// distilled from libg++'s Rational.cc
! // Special g++ Options:
inline int bar () return r {}
--- 1,11 ----
// Build don't link:
! // Copyright (C) 1999, 2000 Free Software Foundation
// by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
// distilled from libg++'s Rational.cc
! // Special g++ Options: -Wno-deprecated
inline int bar () return r {}
Index: testsuite/g++.old-deja/g++.oliva/nameret2.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.oliva/nameret2.C,v
retrieving revision 1.4
diff -c -p -r1.4 nameret2.C
*** nameret2.C 1999/12/26 15:28:17 1.4
--- nameret2.C 2000/09/06 21:15:06
***************
*** 1,11 ****
// Build don't link:
! // Copyright (C) 1999 Free Software Foundation
// by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
// distilled from libg++'s Integer.cc
! // Special g++ Options: -O1
inline int bar () return r {}
--- 1,11 ----
// Build don't link:
! // Copyright (C) 1999, 2000 Free Software Foundation
// by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
// distilled from libg++'s Integer.cc
! // Special g++ Options: -O1 -Wno-deprecated
inline int bar () return r {}
Index: testsuite/g++.old-deja/g++.robertl/eb101.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.robertl/eb101.C,v
retrieving revision 1.4
diff -c -p -r1.4 eb101.C
*** eb101.C 1999/04/29 08:33:55 1.4
--- eb101.C 2000/09/06 21:15:07
***************
*** 1,4 ****
! // Special g++ Options: -fcheck-memory-usage
// Build don't link:
--- 1,4 ----
! // Special g++ Options: -fcheck-memory-usage -Wno-deprecated
// Build don't link:
Index: testsuite/g++.old-deja/g++.robertl/eb27.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.robertl/eb27.C,v
retrieving revision 1.8
diff -c -p -r1.8 eb27.C
*** eb27.C 1998/12/16 22:03:42 1.8
--- eb27.C 2000/09/06 21:15:07
***************
*** 2,8 ****
/* simple program to demonstrate the bug with named return values in gcc
*/
/* (w) 4.9.97 by Kurt Garloff <K.Garloff@ping.de> */
! // Special g++ Options:
// 8/28/1998 - This dies in add_conversions from dfs_walk, null CLASSTYPE_METHOD_VEC
// for the test<T> record_type. This is marked as an expected failure for now,
// until we actually fix it.
--- 2,8 ----
/* simple program to demonstrate the bug with named return values in gcc
*/
/* (w) 4.9.97 by Kurt Garloff <K.Garloff@ping.de> */
! // Special g++ Options: -Wno-deprecated
// 8/28/1998 - This dies in add_conversions from dfs_walk, null CLASSTYPE_METHOD_VEC
// for the test<T> record_type. This is marked as an expected failure for now,
// until we actually fix it.