[Bug c++/58004] New: Internal compiler error in unify_one_argument, at cp/pt.c:15445

2013-07-27 Thread lin90162 at gmail dot com
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

2014-01-15 Thread lin90162 at gmail dot com
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.