Commit Graph

114745 Commits

Author SHA1 Message Date
Mikael Morin
d836651c85 re PR fortran/50981 ([OOP] Wrong-code for scalarizing ELEMENTAL call with absent OPTIONAL argument)
2012-01-16  Mikael Morin  <mikael@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/50981
        * trans-array.c (gfc_walk_elemental_function_args): Fix
        passing of deallocated allocatables/pointers as absent argument. 

2012-01-16  Mikael Morin  <mikael@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/50981
        * gfortran.dg/elemental_optional_args_3.f90: New
        * gfortran.dg/elemental_optional_args_4.f90: New


Co-Authored-By: Tobias Burnus <burnus@net-b.de>

From-SVN: r183220
2012-01-16 20:51:44 +01:00
Tobias Burnus
22c30bc09a re PR fortran/51809 ([OOP] ICE (segfault) depending on USE statements order)
2012-01-16  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51809
        * class.c (gfc_find_derived_vtab): Mark __vtab and
        __def_init as FL_VARIABLE not as FL_PARAMETER.
        * expr.c (gfc_simplify_expr): Remove special
        handling of __vtab.
        * resolve.c (resolve_values): Ditto.
        * trans-decl.c (gfc_get_symbol_decl): Mark __vtab
        and __def_init as TREE_READONLY.

2012-01-16  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51809
        * gfortran.dg/use_20.f90: New

From-SVN: r183219
2012-01-16 20:50:11 +01:00
Jason Merrill
645c7a55f8 re PR c++/51868 (Crash when generating the move constructor for a class with a bit field)
PR c++/51868
	* typeck.c (build_static_cast_1): Handle bit-fields properly.

From-SVN: r183218
2012-01-16 13:40:26 -05:00
Zydrunas Gimbutas
f434733449 re PR fortran/48426 ([patch] Quad precision promotion)
2012-01-16  Zydrunas Gimbutas  <gimbutas@cims.nyu.edu>
	    Andreas Kloeckner  <kloeckner@cims.nyu.edu>
	    Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/48426
	* gfortran.h (gfc_option_t): Add members flag_*_kind to store kind.
	* lang.opt: Add options -freal-4-real-8, -freal-4-real-10,
	-freal-4-real-16, -freal-8-real-4, -freal-8-real-10, -freal-8-real-16
	and -finteger-4-integer-8. User-desired type conversion information.
	* decl.c (gfc_match_old_kind_spec,kind_expr): Type conversions
	in declaration parsing.
	* trans-types.c (gfc_init_kinds): User-specified type conversion
	checked for current backend.
	* primary.c (match_integer_constant,match_real_constant): Implement
	type conversion in constant parsing.
	* options.c (gfc_init_options,gfc_handle_option): Translate input
	options to flags in internal options data structure.
	* invoke.texi: Document new options.  Re-order options in Options
	summary section.

From-SVN: r183217
2012-01-16 18:22:16 +00:00
Paul Thomas
866e6d1bc1 trans-array.c (gfc_trans_create_temp_array): In the case of a class array temporary...
2012-01-16  Paul Thomas  <pault@gcc.gnu.org>

	* trans-array.c (gfc_trans_create_temp_array): In the case of a
	class array temporary, detect a null 'eltype' on entry and use 
	'initial' to provde the class reference and so, through the
	vtable, the element size for the dynamic type.
	* trans-stmt.c (gfc_conv_elemental_dependencies): For class
	expressions, set 'eltype' to null and pass the values via the
	'initial' expression.

2012-01-16  Paul Thomas  <pault@gcc.gnu.org>

	* gfortran.dg/class_array_3.f03: Remove the explicit loop in
	subroutine 'qsort' and use index array to assign the result.

From-SVN: r183216
2012-01-16 17:48:26 +00:00
Jan Hubicka
c53153e7a0 re PR c/12245 (Uses lots of memory when compiling large initialized arrays)
PR c/12245
	PR c++/14179
	* convert.c (convert_to_integer): Use fold_convert for
	converting an INTEGER_CST to integer type.

From-SVN: r183214
2012-01-16 11:40:38 -05:00
Jason Merrill
7aeb037b25 re PR c++/14179 (out of memory while parsing array with many initializers)
PR c++/14179
	* vec.c (vec_gc_o_reserve_1): Use ggc_round_alloc_size.

From-SVN: r183213
2012-01-16 11:40:26 -05:00
Jakub Jelinek
00fbd5c8c7 re PR bootstrap/51860 (s390 esa mode bootstrap comparison failure since transactional memory branch merge)
PR bootstrap/51860
	* config/s390/s390.c (s390_chunkify_start): Don't skip
	call insns followed by NOTE_INSN_CALL_ARG_LOCATION note.  Skip
	NOTE_INSN_VAR_LOCATION and NOTE_INSN_CALL_ARG_LOCATION notes.
	If insn is followed by NOTE_INSN_VAR_LOCATION or
	NOTE_INSN_CALL_ARG_LOCATION notes, insert jump after all those notes.
	Don't use location of note insns.

From-SVN: r183210
2012-01-16 15:05:54 +01:00
Jakub Jelinek
90dda0e956 re PR tree-optimization/51865 (ICE in insert_vi_for_tree, at tree-ssa-structalias.c:2642)
PR tree-optimization/51865
	* tree-inline.c (tree_function_versioning): Call remap_decl
	on DECL_RESULT whenever it has VOID_TYPE_P type.

	* gcc.dg/pr51865.c: New test.

From-SVN: r183207
2012-01-16 12:12:53 +01:00
GCC Administrator
12e3ff92d4 Daily bump.
From-SVN: r183204
2012-01-16 00:19:36 +00:00
Richard Sandiford
62835ceecc mips.c (mips16_build_call_stub): Don't use a stub for calls to locally-binding MIPS16 functions if...
gcc/
	* config/mips/mips.c (mips16_build_call_stub): Don't use a stub
	for calls to locally-binding MIPS16 functions if only the return
	type uses float regs.

From-SVN: r183197
2012-01-15 18:47:20 +00:00
Richard Sandiford
0d508a19cd ssa-dom-thread-4.c: Expect 4 threaded edges for MIPS.
gcc/testsuite/
	* gcc.dg/tree-ssa/ssa-dom-thread-4.c: Expect 4 threaded edges for MIPS.

From-SVN: r183196
2012-01-15 18:31:33 +00:00
Richard Sandiford
ddaf812593 mips-protos.h (SYMBOL_FORCE_TO_MEM): Delete.
gcc/
2012-01-08  Chung-Lin Tang  <cltang@codesourcery.com>
	    Richard Sandiford  <rdsandiford@googlemail.com>

	* config/mips/mips-protos.h (SYMBOL_FORCE_TO_MEM): Delete.
	(SYMBOL_32_HIGH): Likewise.
	(mips_output_tls_reloc_directive): Declare.
	* config/mips/mips.h (PIC_FUNCTION_ADDR_REGNUM): Move to mips.md.
	(mips_use_pcrel_pool_p, mips_lo_relocs, mips_hi_relocs): Declare.
	* config/mips/mips.c (mips_use_pcrel_pool_p): New variable.
	(mips_lo_relocs, mips_hi_relocs): Make extern.
	(mips16_stub_function): Move up file.
	(mips_classify_symbol): Remove SYMBOL_FORCE_TO_MEM handling.
	(mips_symbolic_constant_p): Likewise.  Remove SYMBOL_32_HIGH too.
	(mips_symbol_insns_1): Likewise.  Check mips_use_pcrel_pool_p.
	(mips_cannot_force_const_mem): Use mips_use_pcrel_pool_p instead
	of SYMBOL_FORCE_TO_MEM.  Only check mips_tls_symbol_ref_1
	if it's false.
	(mips_get_tp): Add MIPS16 support.
	(mips_legitimize_tls_address): Remove MIPS16 sorry().
	Generalize DTPREL and TPREL handling.
	(mips_init_relocs): Initialize mips_use_pcrel_pool_p.
	Add MIPS16 TLS support.
	(mips_output_tls_reloc_directive): New function.
	(mips16_rewrite_pool_refs): Ignore UNSPEC_TLS_GET_TPs.
	* config/mips/predicates.md (symbolic_operand_with_high)
	(tls_reloc_operand): New predicates.
	(force_to_mem_operand): Use mips_use_pcrel_pool_p.
	* config/mips/mips.md (UNSPEC_UNSHIFTED_HIGH): New unspec.
	(PIC_FUNCTION_ADDR_REGNUM): Moved from mips.h.
	(*unshifted_high): New instruction.  Use it for MIPS16
	high splitter.
	(consttable_tls_reloc, tls_get_tp_mips16_<mode>): New patterns.
	(*tls_get_tp_mips16_call_<mode>): Likewise.

gcc/testsuite/
	* gcc.target/mips/code-readable-2.c: Allow the jump table address
	to be loaded from the constant pool, rather than via %hi and %lo.

libgcc/
2012-01-08  Chung-Lin Tang  <cltang@codesourcery.com>
	    Richard Sandiford  <rdsandiford@googlemail.com>

	* config/mips/libgcc-mips16.ver (__mips16_rdhwr): Add.
	* config/mips/mips16.S (__mips16_rdhwr): New function.
	* config/mips/t-mips16 (LIB1ASMFUNCS): Add _m16rdhwr.

From-SVN: r183195
2012-01-15 18:22:55 +00:00
Uros Bizjak
bf63ef6c22 re PR rtl-optimization/51821 (64bit > 32bit conversion produces incorrect results with optimizations)
PR rtl-optimization/51821
	* recog.c (peep2_find_free_register): Determine clobbered registers
	from insn pattern.

testsuite/ChangeLog:

	PR rtl-optimization/51821
	* gcc.dg/pr51821.c: New test.

From-SVN: r183194
2012-01-15 19:03:46 +01:00
Andreas Schwab
512b60583e * gcc.dg/torture/pr8081.c: Fix char signedness assumption.
From-SVN: r183192
2012-01-15 14:50:41 +00:00
GCC Administrator
0f63511a7d Daily bump.
From-SVN: r183190
2012-01-15 00:19:12 +00:00
Andreas Schwab
e3b2accb78 * g++.dg/cpp0x/constexpr-rom.C: Add -G0 where applicable.
From-SVN: r183186
2012-01-14 20:59:32 +00:00
Andreas Schwab
a8a9e2a889 Makefile.in (OSCONS_EXTRACT): Add $(GNATLIBCFLAGS).
* gcc-interface/Makefile.in (OSCONS_EXTRACT): Add
$(GNATLIBCFLAGS).

From-SVN: r183185
2012-01-14 20:53:01 +00:00
Denis Chertykov
cfbaed3b4c re PR other/50925 ([avr] ICE at spill_failure, at reload1.c:2118)
PR target/50925
	* config/avr/avr-protos.h: Revert change of 2012-01-09.
	* config/avr/avr.c: Likewise.
	* config/avr/avr.h: Likewise.

From-SVN: r183183
2012-01-14 22:11:29 +04:00
Jonathan Wakely
af7b9e82d0 * include/bits/stl_iterator.h (reverse_iterator): Doxygen comments.
From-SVN: r183182
2012-01-14 17:47:18 +00:00
Tobias Burnus
068ed5e0e1 re PR fortran/51800 (Error: Automatic array 'dummy' at (1) cannot have an initializer)
2012-01-14  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51800
        * resolve.c (build_default_init_expr): Also initialize
        nonconstant-length strings with -finit-character=<n>.

2012-01-14  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51800
        * gfortran.dg/init_flag_8.f90: New.
        * gfortran.dg/init_flag_9.f90: New.

From-SVN: r183180
2012-01-14 13:05:59 +01:00
Tobias Burnus
74250065e2 re PR fortran/51816 (Wrong error when use..., only : operator() twice)
2011-01-14  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51816
        * module.c (read_module): Don't make nonexisting
        intrinsic operators as found.
        (rename_list_remove_duplicate): New function.
        (gfc_use_modules): Use it.

2011-01-14  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51816
        * gfortran.dg/use_18.f90: New.
        * gfortran.dg/use_19.f90: New.

From-SVN: r183179
2012-01-14 13:04:20 +01:00
Ian Lance Taylor
12448f77a5 re PR c++/50012 (C++ front end misses -Wsign-compare warnings when extraneous parentheses are present)
gcc/:
	PR c++/50012
	* tree.h (TYPE_QUALS): Add cast to int.
	(TYPE_QUALS_NO_ADDR_SPACE): Likewise.
gcc/cp:
	PR c++/50012
	* typeck.c (enum_cast_to_int): New static function.
	(cp_build_binary_op): When handling warn_sign_compare, don't test
	for TREE_NO_WARNING.  Do call enum_cast_to_int.
	* call.c (avoid_sign_compare_warnings): Remove static function.
	(build_new_op_1): Don't call avoid_sign_compare_warnings.
gcc/testsuite/:
	PR c++/50012
	* g++.dg/warn/Wsign-compare-4.C: New.

From-SVN: r183178
2012-01-14 00:22:14 +00:00
GCC Administrator
738134ef33 Daily bump.
From-SVN: r183177
2012-01-14 00:19:10 +00:00
Torvald Riegel
aab74ee9d4 libitm: Truncate undo log after rolling back.
libitm/
	* local.cc (GTM::gtm_undolog::rollback): Truncate undo log after
	rolling back.
	* containers.h (GTM::vector::set_size): New.

From-SVN: r183173
2012-01-13 23:45:42 +00:00
Torvald Riegel
07b6642b93 libitm: Filter out undo writes that overlap with the libitm stack.
PR libitm/51855
	* config/generic/tls.h (GTM::mask_stack_top): New.
	(GTM::mask_stack_bottom): Declare.
	* config/generic/tls.c (GTM::mask_stack_bottom): New.
	* local.cc (gtm_undolog::rollback): Filter out any updates that
	overlap the libitm stack.  Add current transaction as parameter.
	* libitm_i.h (GTM::gtm_undolog::rollback): Adapt.
	* beginend.cc (GTM::gtm_thread::rollback): Adapt.
	* testsuite/libitm.c/stackundo.c: New test.

From-SVN: r183172
2012-01-13 23:45:06 +00:00
Ian Lance Taylor
4cce1836bd libgo: Only build iopl and ioperm on 386, amd64, alpha GNU/Linux.
From-SVN: r183171
2012-01-13 23:35:44 +00:00
Ian Lance Taylor
dd1628807a mksysinfo: Pick up TIOCGWINSZ even if expression is too complex.
From-SVN: r183169
2012-01-13 23:17:20 +00:00
Ian Lance Taylor
daeae9f196 mksysinfo: Make sure EPOLL_CLOEXEC is defined.
From-SVN: r183168
2012-01-13 23:03:02 +00:00
Ian Lance Taylor
932c774427 Update copyright year.
From-SVN: r183167
2012-01-13 22:29:05 +00:00
Ian Lance Taylor
9ab6f957a2 ipa-cp.c (ipa_get_indirect_edge_target): Add typecasts when comparing param_index to VEC_length result.
* ipa-cp.c (ipa_get_indirect_edge_target): Add typecasts when
	comparing param_index to VEC_length result.

From-SVN: r183166
2012-01-13 22:25:44 +00:00
Steven Bosscher
8554df86e0 c-decl.c: Do not include tree-mudflap.h
gcc/
	* c-decl.c: Do not include tree-mudflap.h
	* tree-optimize.c: Likewise.
	* Makefile.in: Update dependencies.

cp/
	* decl2.c: Do not include tree-mudflap.h
	* semantics.c: Likewise.

From-SVN: r183165
2012-01-13 22:14:21 +00:00
François Dumont
f86b266c7c hashtable_policy.h (_Hash_node_base): New, use it as base class of ...
2012-01-13  François Dumont  <fdumont@gcc.gnu.org>

	* include/bits/hashtable_policy.h (_Hash_node_base): New, use it as
	base class of ...
	(_Hash_node<Value, true>, _Hash_node<Value, false>): ... those.
	* include/bits/hashtable.h (_Hashtable): Replace _M_begin_bucket_index
	by _M_before_begin. Review implementation so that we do not need to
	look for previous non-empty bucket when inserting nodes.

From-SVN: r183164
2012-01-13 21:49:14 +00:00
Paul Thomas
d6430d9a0c re PR fortran/48351 ([OOP] Realloc on assignment fails if parent component is CLASS)
2012-01-13  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/48351
	* trans-array.c (structure_alloc_comps): Suppress interative
	call to self, when current component is deallocated using
	gfc_trans_dealloc_allocated.
	* class.c (gfc_build_class_symbol): Copy the 'alloc_comp'
	attribute from the declared type to the class structure.

2012-01-13  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/48351
	* gfortran.dg/alloc_comp_assign.f03: New.
	* gfortran.dg/allocatable_scalar_9.f90: Reduce count of
	__BUILTIN_FREE from 38 to 32.

From-SVN: r183162
2012-01-13 20:42:01 +00:00
Jason Merrill
04771457dc re PR c++/20681 (wrong "control reaches" warning with switches)
PR c++/20681
	* semantics.c (finish_break_stmt): Avoid adding an unreachable
	BREAK_STMT.

From-SVN: r183161
2012-01-13 15:06:16 -05:00
Georg-Johann Lay
07dee0c66a pr49871.c: Add dg-require-effective-target int32plus because of big array needed.
* gcc.dg/debug/dwarf2/pr49871.c: Add dg-require-effective-target
	int32plus because of big array needed.

From-SVN: r183159
2012-01-13 19:05:24 +00:00
Georg-Johann Lay
7a852b9656 20120111-1.c: Fix wrong int = int32_t assumption.
* gcc.c-torture/execute/20120111-1.c: Fix wrong int = int32_t
	assumption.
	* g++.dg/ipa/pr51759.C: Fix assumption sizeof(int) > 2.
	* gcc.dg/cpp/warn-multichar.c: Fix to work on int=16 platforms.
	* gcc.dg/cpp/warn-multichar-2.c: Ditto.
	* gcc.dg/debug/dwarf2/pr49871.c: Add dg-require-effective-target
	int32plus because of big array needed.
	* gcc.dg/pr50527.c: Don't FAIL if sizeof(void*) = 2
	* gcc.dg/lto/20090218-2_1.c: Fix prototype of malloc, memcpy.

From-SVN: r183158
2012-01-13 19:03:20 +00:00
Jason Merrill
fc97053254 re PR c++/51813 (-fvisibility=hidden causes std::codecvt members to be undefined)
PR c++/51813
	* decl2.c (constrain_visibility): Clear DECL_VISIBILITY_SPECIFIED
	when reducing the visibility.

From-SVN: r183156
2012-01-13 12:50:58 -05:00
Jason Merrill
4ce7d589fe re PR c++/51620 ([c++0x] [4.6/4.7 Regression] ICE with private destructor)
PR c++/51620
	* class.c (build_vtbl_initializer): Use __cxa_deleted_virtual.

From-SVN: r183155
2012-01-13 10:49:29 -05:00
Tobias Burnus
8395e28bbf re PR fortran/51842 (fortran fails if ssize_t is 32-bit on 64-bit host)
2012-01-13  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51842
        * fortran/trans-types.c (gfc_init_kinds): Use PTRDIFF_TYPE
        instead of a signed int of size POINTER_SIZE for
        gfc_index_integer_kind.

From-SVN: r183154
2012-01-13 16:41:13 +01:00
Richard Guenther
aabb90e5ad re PR c/8081 (ICE with variably sized types returned from nested functions)
2012-01-13  Richard Guenther  <rguenther@suse.de>

	PR middle-end/8081
	* gimplify.c (gimplify_modify_expr_rhs): For calls with a
	variable-sized result always use RSO.

	* gcc.dg/torture/pr8081.c: New testcase.

From-SVN: r183153
2012-01-13 12:05:27 +00:00
Georg-Johann Lay
b9b16ad409 pr46309.c: Set branch cost to greater 1 for avr.
* gcc.dg/pr46309.c: Set branch cost to greater 1 for avr.

From-SVN: r183151
2012-01-13 10:32:16 +00:00
Ian Lance Taylor
df4aa89a5e libgo: Update to weekly.2011-12-22.
From-SVN: r183150
2012-01-13 05:11:45 +00:00
Jason Merrill
f83fa0bf8f re PR c++/51714 (internal compiler error: Segmentation fault with -std=c++11)
PR c++/51714
	* pt.c (value_dependent_expression_p): Treat STMT_EXPR as
	value-dependent.

From-SVN: r183149
2012-01-13 00:05:46 -05:00
GCC Administrator
6fd52f69db Daily bump.
From-SVN: r183148
2012-01-13 00:19:18 +00:00
Dodji Seketeli
1cef710256 PR c++/51633 - ICEs with constexpr constructor
gcc/cp/

	PR c++/51633
	* semantics.c (cp_parser_ctor_initializer_opt_and_function_body):
	Set the pointer to the last block of the constructor to the
	current statement.
	(build_constexpr_constructor_member_initializers): Get
	build_data_member_initialization a chance to deal with more
	statements before we choke.

gcc/testsuite/

	PR c++/51633
	* g++.dg/cpp0x/constexpr-diag4.C: New test.

From-SVN: r183144
2012-01-13 00:28:46 +01:00
DJ Delorie
639d4bb87c cfgexpand.c (convert_debug_memory_address): Allow any valid pointer type, not just the default pointer type.
* cfgexpand.c (convert_debug_memory_address): Allow any valid
pointer type, not just the default pointer type.

From-SVN: r183141
2012-01-12 16:37:03 -05:00
Tobias Burnus
9c69933102 re PR libfortran/36755 (Avoid fork/exec in chmod intrinsic)
2012-01-12  Tobias Burnus  <burnus@net-b.de>

        PR fortran/36755
        * intrinsic.texi (CHMOD): Extend a bit and remove statement
        that /bin/chmod is called.

2012-01-12  Tobias Burnus  <burnus@net-b.de>

        PR fortran/36755
        * intrinsics/chmod.c (chmod_func): Replace call to /bin/chmod

From-SVN: r183137
2012-01-12 21:26:10 +01:00
Richard Henderson
105b876e55 re PR other/50925 ([avr] ICE at spill_failure, at reload1.c:2118)
PR target/50925
	* config/avr/avr-protos.h (avr_hard_regno_nregs): Declare.
	* config/avr/avr.c (avr_can_eliminate): Simplify.
	(avr_initial_elimination_offset): Likewise.
	(avr_prologue_setup_frame): Use hard_frame_pointer_rtx.
	(expand_epilogue): Likewise.
	(avr_legitimize_address): Gut.
	(avr_legitimize_reload_address): Use hard_frame_pointer_rtx.
	(avr_hard_regno_nregs): New.
	(avr_hard_regno_ok): Allow only Pmode for arg and frame_pointers.
	(avr_regno_mode_code_ok_for_base_b): Handle arg and frame pointers.
	* config/avr/avr.h (FIXED_REGISTERS): Adjust arg pointer,
	add soft frame pointer.
	(CALL_USED_REGISTERS): Likewise.
	(REG_CLASS_CONTENTS): Likewise.
	(REGISTER_NAMES): Likewise.
	(HARD_REGNO_NREGS): Use avr_hard_regno_nregs.
	(HARD_FRAME_POINTER_REGNUM): New.
	(FRAME_POINTER_REGNUM): Use soft frame pointer.
	(ELIMINABLE_REGS): Eliminate from the soft frame pointer,
	remove the HARD_FRAME_POINTER self-elimination.


Co-Authored-By: Denis Chertykov <chertykov@gmail.com>

From-SVN: r183136
2012-01-12 22:29:54 +04:00
Jason Merrill
4643a68ec2 re PR c++/48051 (sorry, unimplemented: mangling overload)
PR c++/48051
	* mangle.c (write_expression): Mangle BASELINK scope if
	BASELINK_QUALIFIED_P.
	* search.c (adjust_result_of_qualified_name_lookup): Set
	BASELINK_QUALIFIED_P.
	* tree.c (cp_tree_equal) [BASELINK]: Compare BASELINK_QUALIFIED_P.
	* parser.c (cp_parser_postfix_dot_deref_expression): Don't call
	adjust_result_of_qualified_name_lookup for non-qualified names.

From-SVN: r183133
2012-01-12 12:27:07 -05:00