__wine_uuidof causing a wall of "warning: returning reference to temporary" on g++

Jacek Caban jacek at codeweavers.com
Sun Jul 29 13:47:13 CDT 2012


On 7/29/12 4:32 PM, Ilya Konstantinov wrote:
> Hi,
>
> I've just started porting my C++ application to Linux with Winelib.
>
> Upon first attempts to compile, I've received a wall of "warning: 
> returning reference to temporary" on Wine's headers from g++.
> All of those seem to stem from guidgen.h definition of 
> __wine_uuidof / __CRT_UUID_DECL for C++.
>
> All in all, g++ seems to be right -- we are indeed returning a 
> reference to a IID struct that's allocated on the stack.

I don't see these warnings here. Also Wine has the same code for 
__uuidof as mingw-w64, which is much more widely used with g++ (Wine is 
mostly tested on C), and I never heard about such problem. Do you have 
any idea about what could be different in your setup? What's your g++ 
version?

> If I remove the '&' in this definition (in guidgen.h):
>    template<typename T> const GUID &__wine_uuidof();
> the warnings stop, but then I wonder, did the original author have 
> some good reasoning for returning a reference in the first place?

The idea is that if matches closer to the meaning of __uuidof, which 
should return a reference to constant IID structure. I'd expect compiler 
to be smart enough to produce same code without the reference anyway 
(after all it's an inline function), but still being more explicit would 
be nice. Could you please test if the attached patch fixes the problem 
for you?

Jacek
-------------- next part --------------
diff --git a/include/guiddef.h b/include/guiddef.h
index 26b1ad7..37a7773 100644
--- a/include/guiddef.h
+++ b/include/guiddef.h
@@ -40,7 +40,8 @@ extern "C++" {
 #define __CRT_UUID_DECL(type,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)           \
     extern "C++" {                                                      \
     template<> inline const GUID &__wine_uuidof<type>() {               \
-        return (const IID){l,w1,w2, {b1,b2,b3,b4,b5,b6,b7,b8}};         \
+        static const IID __iid = {l,w1,w2, {b1,b2,b3,b4,b5,b6,b7,b8}};  \
+        return __iid;                                                   \
     }                                                                   \
     template<> inline const GUID &__wine_uuidof<type*>() {              \
         return __wine_uuidof<type>();                                   \


More information about the wine-devel mailing list