public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c++/9733: Incorrect defintion for allocator<T>::allocate(size_t,void*)
@ 2003-02-17 21:36 ortiza
  0 siblings, 0 replies; only message in thread
From: ortiza @ 2003-02-17 21:36 UTC (permalink / raw)
  To: gcc-gnats; +Cc: thomasl


>Number:         9733
>Category:       c++
>Synopsis:       Incorrect defintion for allocator<T>::allocate(size_t,void*)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Feb 17 21:36:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     Andrew Ortiz
>Release:        gcc version 3.2
>Organization:
>Environment:
SuSe linux 2.4.19 on IBM PowerPC
>Description:
PROBLEM DESCRIPTION:
ISO/IEC 14882:1998(E) 20.1.5 Allocator Requirements Table 32.
2 member functions must be defined for Allocator.

T* a.allocate(n)
T* a.allocate(n,u)

where :
a = a value of type allocator<T>
u = a value of type allocator<void>::const_pointer
n = a value of type allocator<T>::size_type.

allocator<T> is defined in /usr/include/g++/bits/stl_alloc.h on Linux.
Linux accomplishes the above task by defining one allocate(n,u) member function which 
takes 2 arguments with the second argument having a default value.
So the signature for allocate(n,u) is similiar to below.

template <class _Tp> class allocator
{
  _Tp* allocate(size_type __n, const void* = 0) {...}
}

This allows invoking allocate() with 1 or 2 args, in either case the above signature would suffice. 
The problem is, if a derived template class overrides allocate(n,u) and *does not use* a default value 
for argument 2, then allocate(n) will not be found.

So I derived from allocator<T> expecting that there are 2 member functions allocate(n) and allocate(n,u). 
I only want to override allocate(n,u) in my derived template class. The signature is similiar to below:

template <class _Tp> class My_alloc : public std::allocator<T>
{
  _Tp* allocate(size_type __n, const void*) {...}
}

So far this is ANSI compliant. The signature for allocate(n,u) in our derived template
class *does not use* a default value for argument 2, we have problems. 
No version of allocate(n) exists in the base template class or derived template class.
Because vector<>() tries to invoke My_alloc<t>::allocate(n), the testcase cannot compile.

>How-To-Repeat:
STEPS TO REPRODUCE THE PROBLEMS:

---------------------------------------------------------------------------
# 1. README.ksh
#!/usr/bin/ksh
g++ -o a.o a2.cpp
echo Return code: $?

---------------------------------------------------------------------------
/**** 2. a2.cpp   ****/
#include <vector>

template<class T>
   class Myalloc_2 : public std:: allocator<T> {

public:
   typename std:: allocator<T>::pointer
      allocate(typename std:: allocator<T>::size_type N, 
               typename std:: allocator<void>::const_pointer P)           /* ".... P=0)" works*/
   {
        std:: allocator<char> a ;
        return (a.allocate(N, P));      
   }
   void deallocate(typename std:: allocator<T>::pointer P, typename std:: allocator<T>::size_type N)
   {
        std:: allocator<char> a ;
        a.deallocate(P, 1);   
   }
   template <class Z> struct rebind
   {
       typedef Myalloc_2<Z> other;
   };      
};      
                
typedef Myalloc_2<char> use_type;
int main(int argc, char *argv[])
{
        use_type al;
        std:: vector<char, use_type > v4(5, (char)'x', al);
}


--------------------------------------------------------------------------

EXPECTED OUTPUT: 
Return code: 0

ACTUAL OUTPUT:
/usr/include/c++/3.2/bits/stl_vector.h: In member function `_Tp* std::_Vector_alloc_base<_Tp, _Allocator, 
   _IsStatic>::_M_allocate(unsigned int) [with _Tp = char, _Allocator = 
   use_type, bool _IsStatic = false]':
/usr/include/c++/3.2/bits/stl_vector.h:138:   instantiated from `std::_Vector_base<_Tp, _Alloc>::_Vector_base(unsigned int, std::_Vector_alloc_base<_Tp, _Alloc, std::_Alloc_traits<_Tp, _Allocator>::_S_instanceless>::allocator_type&) [with _Tp = char, _Alloc = use_type]'
/usr/include/c++/3.2/bits/stl_vector.h:338:   instantiated from `std::vector<_Tp, _Alloc>::vector(unsigned int, const _Tp&, std::_Vector_base<_Tp, _Alloc>::allocator_type&) [with _Tp = char, _Alloc = use_type]'
a2.cpp:30:   instantiated from here
/usr/include/c++/3.2/bits/stl_vector.h:96: no matching function for call to `Myalloc_2<char>::allocate(size_t&)'
a2.cpp:11: candidates are: std::allocator<_Alloc>::pointer 
   Myalloc_2<T>::allocate(std::allocator<_Alloc>::size_type, const void*) [with 
   T = char]
Return code: 1
>Fix:
Supply member function allocator<T>::allocate(n){}; in /usr/include/g++/bits/stl_alloc.h 
>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-02-17 21:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-17 21:36 c++/9733: Incorrect defintion for allocator<T>::allocate(size_t,void*) ortiza

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).