[Bug c++/58004] New: Internal compiler error in unify_one_argument, at cp/pt.c:15445
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58004 Bug ID: 58004 Summary: Internal compiler error in unify_one_argument, at cp/pt.c:15445 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lin90162 at gmail dot com Code: // hoge.cpp template< class T, T... V > struct L{}; template< class T, class U = L > struct X; template< char... V > struct X< char, L > {}; int main() { typename X::type a; // instantiate specialized template class return 0; } // end of hoge.cpp Error message: hoge.cpp: In function 'int main()': hoge.cpp:13:21: internal compiler error: in unify_one_argument, at cp/pt.c:15445 typename X::type a; // specialized template instantiation ^ hoge.cpp:13:21: internal compiler error: Abort trap: 6 g++-4.8: internal compiler error: Abort trap: 6 (program cc1plus) [1]37562 abort g++-4.8 -std=c++11 -Wall -Wextra -O2 hoge.cpp GCC should occur 'invalid template type argument' error because first template argument of L should be a type but first template argument of L is a value. This internal compiler error seems to occur only in template specialization. I tested this code in gcc 4.7.3, 4.8.1 and 4.9.0 20130726 and all of them fail.
[Bug c++/59829] New: Calling vector::data() occurs undefined behavior when the vector is empty
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59829 Bug ID: 59829 Summary: Calling vector::data() occurs undefined behavior when the vector is empty Product: gcc Version: 4.8.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lin90162 at gmail dot com When vector is empty, calling vector::data() occurs undefined behavior by dereferencing NULL. The implementation of vector::data() and vector::front() in libstdc++ are below /// BEGIN OF CODE reference front() { return *begin(); } const_reference front() const { return *begin(); } data() _GLIBCXX_NOEXCEPT { return std::__addressof(front()); } data() _GLIBCXX_NOEXCEPT { return std::__addressof(front()); } /// END OF CODE Here, when vector is empty, begin() is called, then begin() returns NULL and it is dereferenced. N3337 23.3.6.4 says "Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector, data() == &front()". It means that calling vector::data() is well-defined even if vector is empty. As additional information, libc++ implementation of vector::data() can be called safely when vector is empty.