+2014-07-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/61659
+ PR c++/61687
+ Revert:
+ * c.opt (-fuse-all-virtuals): New.
+
2014-07-30 Tom Tromey <tromey@redhat.com>
PR c/59855
C ObjC C++ ObjC++ LTO Var(flag_signed_char, 0)
Make \"char\" unsigned by default
-fuse-all-virtuals
-C++ ObjC++ Var(flag_use_all_virtuals) Init(1)
-Treat all virtual functions as odr-used
-
fuse-cxa-atexit
C++ ObjC++ Var(flag_use_cxa_atexit) Init(DEFAULT_USE_CXA_ATEXIT)
Use __cxa_atexit to register destructors
2014-07-30 Jason Merrill <jason@redhat.com>
+ PR c++/61659
+ PR c++/61687
+ Revert:
+ * decl2.c (mark_all_virtuals): New variable.
+ (maybe_emit_vtables): Check it instead of flag_devirtualize.
+ (cp_write_global_declarations): Set it and give helpful diagnostic
+ if it introduces errors.
+ * class.c (finish_struct_1): Check it.
+
PR lto/53808
PR c++/61659
* pt.c (push_template_decl_real): Set DECL_COMDAT on templates.
in every translation unit where the class definition appears. If
we're devirtualizing, we can look into the vtable even if we
aren't emitting it. */
- if (CLASSTYPE_KEY_METHOD (t) == NULL_TREE || flag_use_all_virtuals)
+ if (CLASSTYPE_KEY_METHOD (t) == NULL_TREE)
keyed_classes = tree_cons (NULL_TREE, t, keyed_classes);
}
/* Nonzero if we're done parsing and into end-of-file activities. */
int at_eof;
-
-/* Nonzero if we've instantiated everything used directly, and now want to
- mark all virtual functions as used so that they are available for
- devirtualization. */
-static int mark_all_virtuals;
\f
/* Return a member function type (a METHOD_TYPE), given FNTYPE (a
if (DECL_COMDAT (primary_vtbl)
&& CLASSTYPE_DEBUG_REQUESTED (ctype))
note_debug_info_needed (ctype);
- if (mark_all_virtuals && !DECL_ODR_USED (primary_vtbl))
- {
- /* Make sure virtual functions get instantiated/synthesized so that
- they can be inlined after devirtualization even if the vtable is
- never emitted. */
- mark_used (primary_vtbl);
- mark_vtable_entries (primary_vtbl);
- return true;
- }
return false;
}
instantiated, etc., etc. */
emit_support_tinfos ();
- int errs = errorcount + sorrycount;
- bool explained_devirt = false;
do
{
pending_statics->length ()))
reconsider = true;
- if (flag_use_all_virtuals)
- {
- if (!reconsider && !mark_all_virtuals)
- {
- mark_all_virtuals = true;
- reconsider = true;
- errs = errorcount + sorrycount;
- }
- else if (mark_all_virtuals
- && !explained_devirt
- && (errorcount + sorrycount > errs))
- {
- inform (global_dc->last_location, "this error is seen due to "
- "instantiation of all virtual functions, which the C++ "
- "standard says are always considered used; this is done "
- "to support devirtualization optimizations, but can be "
- "disabled with -fno-use-all-virtuals");
- explained_devirt = true;
- }
- }
-
retries++;
}
while (reconsider);
-fno-pretty-templates @gol
-frepo -fno-rtti -fstats -ftemplate-backtrace-limit=@var{n} @gol
-ftemplate-depth=@var{n} @gol
--fno-threadsafe-statics -fno-use-all-virtuals -fuse-cxa-atexit @gol
+-fno-threadsafe-statics -fuse-cxa-atexit @gol
-fno-weak -nostdinc++ @gol
-fvisibility-inlines-hidden @gol
-fvtable-verify=@var{std|preinit|none} @gol
option to reduce code size slightly in code that doesn't need to be
thread-safe.
-@item -fno-use-all-virtuals
-@opindex fno-use-all-virtuals
-By default, G++ now treats all virtual functions declared in a
-translation unit as odr-used, so they will be instantiated or
-synthesized if possible even if they are not needed for the final
-output. This is done so that such functions can be inlined after
-devirtualization changes an indirect call into a direct call. If this
-instantiation and synthesis prevents your code from compiling
-successfully, you can disable it with this option.
-
@item -fuse-cxa-atexit
@opindex fuse-cxa-atexit
Register destructors for objects with static storage duration with the
// PR c++/60347
-// { dg-options "-fno-use-all-virtuals" }
struct A;
+++ /dev/null
-// PR c++/60347
-// { dg-options "-fuse-all-virtuals" }
-
-struct A;
-
-template <class T>
-struct B
-{
- T* p;
- virtual ~B() { p->~T(); } // { dg-error "incomplete" }
-};
-
-struct C: B<A> { };