Search

decltype deduces wrong type by jensa79

Closed
as Fixed Help for as Fixed

1
0
Sign in
to vote
Type: Bug
ID: 725189
Opened: 2/16/2012 12:24:53 AM
Access Restriction: Public
Moderator Decision: Sent to Engineering Team for consideration
0
Workaround(s)
0
User(s) can reproduce this bug
#include <vector>


struct Int
{
explicit Int(int);



};


Int intfunc(Int, Int);

template<typename FwdIt, typename Func, typename T>
auto foldl(FwdIt first, FwdIt last, Func f, T initial) ->
decltype(f(initial, *first))
{
for(; first != last; ++first)
{
     initial = f(initial, *first);
}


return initial;



}


// instantiate template to check compilation
void instantiate()
{
std::vector<Int> v;

Int x3 = foldl(v.begin(), v.end(), intfunc, Int(0));
Int x4 = foldl(v.cbegin(), v.cend(), intfunc, Int(0));



}


When I compile this on VC++2010, I get warning:
Warning 1     warning C4172: returning address of local variable or
temporary     c:\users\jensa\desktop\vs2010bug\foldl\foldl\foldl.cpp 18
Warning 2     warning C4172: returning address of local variable or
temporary     c:\users\jensa\desktop\vs2010bug\foldl\foldl\foldl.cpp 18
Details (expand)

Visual Studio/Team Foundation Server/.NET Framework Tooling version

Visual Studio 2010

Steps to reproduce

Compile above code (see appended zip file for complete solution)

Product Language

English

Operating System

Windows 7

Operating System Language

German

Actual results

Warning 1     warning C4172: returning address of local variable or
temporary     c:\users\jensa\desktop\vs2010bug\foldl\foldl\foldl.cpp 18
Warning 2     warning C4172: returning address of local variable or
temporary     c:\users\jensa\desktop\vs2010bug\foldl\foldl\foldl.cpp 18

Expected results

No warning for returning address of local variable.
File Attachments
File Name Submitted By Submitted On File Size  
foldl.zip 2/16/2012 5.24 MB
Sign in to post a comment.
Posted by Microsoft on 2/20/2012 at 5:02 PM
Hello,

Thank you for reporting this bug. We confirmed that it is a bug, and we've fixed it for the next major release of Visual Studio.

Thanks,
Ulzii Luvsanbat
Visual C++ Team
Posted by MS-Moderator08 [Feedback Moderator] on 2/16/2012 at 2:28 AM
Thank you for submitting feedback on Visual Studio 2010 and .NET Framework. Your issue has been routed to the appropriate VS development team for investigation. We will contact you if we require any additional information.
Posted by jensa79 on 2/16/2012 at 12:26 AM
I posted the example in comp.lang.c++.moderated and Daniel Krüger commented:
IMO there is nothing wrong in your code, decltype(f(initial, *first))
should be deduced to be equal to Int, which is exactly the same type
that you are returning. Testing with VS2010 it seems that

static_assert(std::is_same<decltype(f(initial, *first)), T>::value,"");


this test fails pointing to the root of the compiler error. It turns
out, that the wrong result


static_assert(std::is_same<decltype(f(initial, *first)), T&>::value,"");


is accepted. This is definitively a compiler error, the function intfunc
returns an Int and this type is required to be returned by decltype.

Sign in to post a workaround.