Bug 55817

Summary: [C++11] void return value in std::vector<T>::insert() c++11 should be an iterator
Product: gcc Reporter: Jobst.Ziebell
Component: libstdc++Assignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: daniel.kruegler
Priority: P3    
Version: 4.7.1   
Target Milestone: 4.9.0   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2013-01-08 00:00:00
Attachments: Preprocessed file as created by -save-temps
The testcase

Description Jobst.Ziebell 2012-12-27 16:31:28 UTC
Created attachment 29054 [details]
Preprocessed file as created by -save-temps

GCC version: 4.7.1
System type: Mac OS X 10.6.8 (i386-apple-darwin10.8.0)
GCC configure options: --prefix=/Users/JayZ/usr --enable-lto --enable-objc-gc --disable-multilib
Error occurs by command: ~/usr/bin/g++ --std=c++11 insert_error.cpp

Error message (unfortunately in German - but message should be clear):
insert_error.cpp: In Funktion »int main()«:
insert_error.cpp:8:64: Fehler: Umwandlung von »void« in nicht-skalaren Typen »std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}« angefordert

 - A complaint about conversion from type "void" to type "std::vector<int>::iterator"

Expected behaviour:
Flawless compilation and no error message.

As documented by the following websites:
 - "http://www.cplusplus.com/reference/vector/vector/insert/" (C++11 section)
 - "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" (page 726)

Unless I misread the c++11 library requirements (which I hope I didn't) this seems to be an error in the "vector" implementation. The method insert() should return an iterator.

Sincerely

Jobst Ziebell
Comment 1 Jobst.Ziebell 2012-12-27 16:32:32 UTC
Created attachment 29055 [details]
The testcase
Comment 2 Daniel Krügler 2013-01-07 22:54:45 UTC
The same problem seems to exist for gcc 4.8.0 20121209 and for the signatures

void insert(iterator __position, initializer_list<value_type> __l)

(should be:

iterator insert(iterator __position, initializer_list<value_type> __l)
)

void insert(iterator __position, size_type __n, const value_type& __x)

(should be:

iterator insert(iterator __position, size_type __n, const value_type& __x)
)

template<typename _InputIterator,
	       typename = std::_RequireInputIter<_InputIterator>>
void insert(iterator __position, _InputIterator __first,
	       _InputIterator __last)

(should be:

template<typename _InputIterator,
	       typename = std::_RequireInputIter<_InputIterator>>
iterator insert(iterator __position, _InputIterator __first,
	       _InputIterator __last)
)
Comment 3 Jonathan Wakely 2013-01-08 01:00:14 UTC
Known issue, there's probably an existing for it PR somewhere.
Comment 4 Jobst.Ziebell 2014-04-22 21:41:40 UTC
This seems to be fixed in GCC 4.9.0
Comment 5 Jonathan Wakely 2014-04-23 13:07:19 UTC
Yes, fixed for 4.9.0 by r200571