Forward-declaring a class with a __dllexport__ or __dllimport__ attribute elicits the warning "type attributes are honored only at type definition" even when the same attribute is repeated on the class definition. Until recently, this usage was accepted with no diagnostic. An option to inhibit this warning with '-Wall -Wextra' would be welcome, at least on the ms windows platform (on other platforms, and for other attributes, this usage may be uncommon or nonexistent).
Unlike the other cases considered in this patch: http://gcc.gnu.org/ml/gcc-patches/2003-12/msg01004.html here, the meaning is clear; the warning diagnoses only redundancy, which the 'native' compiler for ms windows documents as permissible: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_using_dllimport_and_dllexport_in_c.2b2b.asp | You can declare C++ classes with the dllimport or dllexport attribute. Building a recent cvs snapshot of wxWidgets yields 33673 instances of this warning with MinGW gcc-3.4.2, but only five other warnings. One of that library's maintainers states that they added the redundant declarations throughout because gcc-3.3 required them in some cases. How to reproduce: C:/tmp[0]$cat export_fwd_decl.cpp class __attribute__((__dllexport__)) E; class __attribute__((__dllimport__)) I; class __attribute__((__dllexport__)) E {}; class __attribute__((__dllimport__)) I {}; C:/tmp[0]$/MinGW/bin/g++ -v -save-temps -Wall -Wextra -c export_fwd_decl.cpp Reading specs from /MinGW/bin/../lib/gcc/mingw32/3.4.2/specs Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host= mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable -languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --e nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-ja va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz ation --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.2 (mingw-special) /MinGW/bin/../libexec/gcc/mingw32/3.4.2/cc1plus.exe -E -quiet -v -iprefix \MinG W\bin\../lib/gcc/mingw32/3.4.2/ export_fwd_decl.cpp -Wall -Wextra -o export_fwd_ decl.ii ignoring nonexistent directory "/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../ mingw32/include" ignoring nonexistent directory "/mingw/lib/gcc/mingw32/3.4.2/../../../../mingw32 /include" #include "..." search starts here: #include <...> search starts here: /MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2 /MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/mingw32 /MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward /MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include /MinGW/bin/../lib/gcc/mingw32/3.4.2/include /mingw/lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2 /mingw/lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/mingw32 /mingw/lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward /mingw/lib/gcc/mingw32/3.4.2/../../../../include /mingw/include /mingw/lib/gcc/mingw32/3.4.2/include /mingw/include End of search list. /MinGW/bin/../libexec/gcc/mingw32/3.4.2/cc1plus.exe -fpreprocessed export_fwd_d ecl.ii -quiet -dumpbase export_fwd_decl.cpp -auxbase export_fwd_decl -Wall -Wext ra -version -o export_fwd_decl.s GNU C++ version 3.4.2 (mingw-special) (mingw32) compiled by GNU C version 3.4.2 (mingw-special). GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=130943 export_fwd_decl.cpp:1: warning: type attributes are honored only at type definit ion export_fwd_decl.cpp:2: warning: type attributes are honored only at type definit ion /MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/bin/as.exe -o export_fw d_decl.o export_fwd_decl.s C:/tmp[0]$cat export_fwd_decl.i* # 1 "export_fwd_decl.cpp" # 1 "<built-in>" # 1 "<command line>" # 1 "export_fwd_decl.cpp" class __attribute__((__dllexport__)) E; class __attribute__((__dllimport__)) I; class __attribute__((__dllexport__)) E {}; class __attribute__((__dllimport__)) I {}; -- Summary: Warning on forward declaration of class with __dllexport__ Product: gcc Version: 3.4.2 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: chicares at cox dot net CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-mingw32 GCC host triplet: i686-pc-mingw32 GCC target triplet: i686-pc-mingw32 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20345