GCC 4.6 related common package rebuild failures (was Re: mass rebuild status)

Jakub Jelinek jakub at redhat.com
Wed Feb 9 16:57:25 UTC 2011


On Tue, Feb 08, 2011 at 06:23:57PM -0600, Dennis Gilmore wrote:
> so the mass rebuild is 24 hours in we have completed ~45% of the builds and 
> are at 365 packages failed to build the total number of builds in the mass 
> rebuild is 10404 we are churning along nicely. i expect to complete the first 
> pass sometime in the next 24 hours. so far i think its going pretty well
> some web pages to look at http://ausil.fedorapeople.org/rebuild.html and 
> http://ausil.fedorapeople.org/failed.html these 2 pages are updated ~ every 10 
> minutes. Please drop into #fedora-devel on freenode if you have any questions.

I went through the failed.html list from shortly after you mailed this,
looking for errors related to GCC 4.6 (and sometimes even 4.5).

Here are some common errors.  Please try to fix the issues rather than
adding workaround flags like -fpermissive, -Wno-unused-but-set-variable etc.
Benjamin, do you plan to write http://gcc.gnu.org/gcc-4.6/porting_to.html?
This could serve as partial source for that page.

	void fn (void)
	  int foo;
	  foo = bar ();
	  /* foo is never used.  */
	This is a new warning, which warns about variables that are only
	ever set, but never otherwise used.  Usually such variables useless
	and often even the value assigned to them is computed needlessly,
	sometimes expensively.  In such cases you should just drop the
	vars and initializers.  Sometimes functions called during the
	initialization have important side-effects for the program,
	so you really need to read the source.  So sometimes you want
	to drop the unuse variables, but keep some function calls from
	their initialization in the code.  In some cases (often from
	macro expansion) you just want to keep such unused variables
	around.  You can in that case just cast them to void,
	or add __attribute__((__unused__)) to them.  As this is just
	a warning, it is usually just a nice to fix thing, but for packages
	that are compiled with -Werror it is a must fix.

STL headers not including <cstddef> any longer
	If you see errors like

	'ptrdiff_t' does not name a type
	'size_t' does not name a type
	'NULL' was not declared in this scope
	'size_t' has not been declared
	'offsetof' was not declared in this scope
	there are no arguments to 'offsetof' that depend on a template parameter, so a declaration of 'offsetof' must be available

	or warnings like

	perhaps the 'offsetof' macro was used incorrectly

	then most likely you have C++ code that includes some
	STL headers and relied on them bringing in <stddef.h>
	and is using ::ptrdiff_t, ::size_t, offsetof or NULL
	macros.  The STL headers now just declare std::ptrdiff_t
	and std::size_t itself when needed, and no longer bring
	in <stddef.h>, so if you use the global namespace types
	from stddef.h or offsetof/NULL, just include <cstddef>

uninitialized const
	struct A { int a; A (); };
	struct B : public A { };
	const B b;

	now gets an error:
	error: uninitialized const ‘b’ [-fpermissive]
	note: ‘const struct B’ has no user-provided default constructor

	This is related to http://gcc.gnu.org/PR43890, B above doesn't
	have a user provided default ctor, so either an initializer
	needs to be provided, or the default ctor needs to be added.

reference ‘...’ cannot be declared ‘mutable’
	struct A { mutable int &p; int q; A () : p(q) {} };

	Just remove mutable keyword from references.

taking address of temporary
	struct S { S (); int i; };
	void bar (S *);
	void foo () { bar (&S ()); }


	This used to be just a warning, now it is an error (unless
	-fpermissive).  Please don't add -fpermissive, instead just
	add a variable and pass address of the variable if at all

duplicate member
	struct A { int *a; union { struct { int *a; }; }; };

	used to be diagnosed just by C++ FE, now since
	http://gcc.gnu.org/PR4784 it is diagnosed also by C.
	Because of the anonymous unions/structs there is ambiguity
	about what .a actually refers to, one of the fields needs
	to be renamed.

unrecognized option '-combine'
	The -combine option has been removed, it has been very buggy and has
	been superceeded by -flto.  Either drop it, or build with -flto.

	Some packages are passing -export-dynamic to gcc/g++ drivers,
	when they should be using -Wl,-export-dynamic or -rdynamic or
	-Wl,-E.  See http://gcc.gnu.org/PR47390, it is unclear yet
	whether gcc 4.6 will handle it for backwards compatibility when
	it has never been documented it would work this way.

	gcc/g++ drivers in 4.4/4.5 didn't accept these options either,
	so I guess this is some libtool issue.  Some packages are also
	using -Wl, --export-dynamic (note the space in between -Wl,
	and the option).  That's wrong, but didn't work previously either.

cannot call constructor directly
	struct A { A (); A (int); int i; };
	A::A (int x) { A::A (); i = x; }

	This used to be accepted in 4.4, but already 4.5 rejects it
	(so 4.5 porting_to.html material).  http://gcc.gnu.org/PR42415

storage size of '...' isn't constant
	void foo (void) { static char buffers[2][(int)(sizeof(int)*3.32)+3]; }

	This used to be accepted in C until 4.4, but isn't any longer,
	since floating point multiplication there makes it no longer
	a valid constant expression.  In this case just multiply by 4
	instead (but even sizeof(...)*3 +3 would work for "%llu" or "HEAD").
	Again, 4.5 porting_to.html material.

names the constructor, not the type
	struct S { S (); };
	void foo () { S::S s; }

	This used to be accepted until 4.4, but isn't any longer,
	::S should be dropped.  http://gcc.gnu.org/PR9050
	4.5 porting_to.html material.

internal compiler error
	If you see this, please do a build in local mock and file a
	bugreport with the attached /tmp/cc*.out file from the buildroot
	about which the gcc/g++ error talked about.  If none has been
	prepared and it is still reproduceable (shouldn't happen), then
	please preprocess it manually, verify it reproduces with the
	preprocessed file and file it.
GCC bugs:
	http://gcc.gnu.org/PR47662 - -fno-operator-names no longer works with STL
	http://gcc.gnu.org/PR47665 - ICE in trunc_int_for_mode on SSE2 code
	http://gcc.gnu.org/PR47666 - ICE in dfs_walk_once


More information about the devel mailing list