[Bug c++/82565] New: Concept and lambda return type deduction cause compilation to crash with "mmap: Cannot allocate memory"
haaawk at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Oct 16 15:20:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82565
Bug ID: 82565
Summary: Concept and lambda return type deduction cause
compilation to crash with "mmap: Cannot allocate
memory"
Product: gcc
Version: 7.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: haaawk at gmail dot com
Target Milestone: ---
Created attachment 42378
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42378&action=edit
file that crashes compilation "g++ -fconcepts crash.cpp"
The file I attached crashes the following compilation:
g++ -fconcepts crash.cpp
both on GCC 7.1.1 and GCC 7.2.
GCC 7.1.1 gives the following result:
crash.cpp: In instantiation of ‘run_test()::<lambda(auto:1&)> [with auto:1 =
const std::__cxx11::basic_string<char>]’:
crash.cpp:9:12: required from here
crash.cpp:49:58: internal compiler error: Segmentation fault
return object.visit([] (auto& x) { return x.empty(); });
GCC 7.2 gives the following result:
crash.cpp: In instantiation of 'run_test()::<lambda(auto:1&)> [with auto:1 =
const std::__cxx11::basic_string<char>]':
crash.cpp:9:12: required from here
crash.cpp:49:58: internal compiler error: Segmentation fault
return object.visit([] (auto& x) { return x.empty(); });
^
mmap: Cannot allocate memory
The file compiles correctly after commenting out line 31 which applies Concept
to visit method:
requires Concept<Visitor,
decltype(std::declval<Visitor>()(std::declval<std::string&>()))>()
or after explicit declaration of the return type to "-> bool" on lambda in line
49:
return object.visit([] (auto& x) -> bool { return x.empty(); });
Below I'm pasting the content of the crash.cpp file:
#include<vector>
#include<string>
#include<memory>
#include<iostream>
template<typename T, typename ReturnType>
concept bool Concept() {
return requires(T t, const std::string& s, const std::vector<int>& v) {
{ t(s) } -> ReturnType;
{ t(v) } -> ReturnType;
};
}
struct test {
enum class kind {
string, vector
};
struct data {
data() { }
~data() { }
union {
std::string _str;
std::vector<int> _v;
};
};
kind _kind;
std::unique_ptr<data> _data;
template<typename Visitor>
requires Concept<Visitor,
decltype(std::declval<Visitor>()(std::declval<std::string&>()))>()
decltype(auto) visit(Visitor&& visitor) const {
switch (_kind) {
case kind::string:
return visitor(_data->_str);
case kind::vector:
return visitor(_data->_v);
}
abort();
}
};
bool run_test() {
test object;
object._kind = test::kind::string;
object._data = std::make_unique<test::data>();
new (&object._data->_str) std::string("hello test");
return object.visit([] (auto& x) { return x.empty(); });
}
int main() {
std::cout << run_test() << std::endl;
return 0;
}
More information about the Gcc-bugs
mailing list