This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Missing concept check instantiations on sparc-sun-solaris2.8 cross sometimes


On Tue, Jun 10, 2003 at 06:14:17PM -0400, Phil Edwards wrote:
> > I have determined that by using the std::copy() algorithm (for any
> > types?) causes the templates to be instantiated (or something) and the
> > problem goes away.
> [...]
> > With the copy line commented out, I get linker errors reporting that
> > some of the instantiations are missing.   Uncommenting it fixes the
> > problem.
> 
> If you uncomment that line, and compile to a .o, and then run nm over the
> .o file, you'll see which checks are being additionally instantiated.

Here are the __gnu_cxx symbols that are in the test programs' .o but
not in concept-inst.o:

__gnu_cxx::_AssignableConcept<char*>::__const_constraints(char*
const&)
__gnu_cxx::_AssignableConcept<char*>::__constraints()
__gnu_cxx::_ConvertibleConcept<std::random_access_iterator_tag,
std::input_iterator_tag>::__constraints()
__gnu_cxx::_DefaultConstructibleConcept<char*>::__constraints()
__gnu_cxx::_EqualityComparableConcept<char*>::__constraints()
__gnu_cxx::_InputIteratorConcept<char*>::__constraints()
__gnu_cxx::_OutputIteratorConcept<char*, char>::__constraints()
__gnu_cxx::_TrivialIteratorConcept<char*>::__constraints()
void __gnu_cxx::__aux_require_boolean_expr<bool>(bool const&)
void __gnu_cxx::__function_requires<__gnu_cxx::_AssignableConcept<char*>
>()
void __gnu_cxx::__function_requires<__gnu_cxx::_ConvertibleConcept<std::random_access_iterator_tag,
std::input_iterator_tag> >()
void __gnu_cxx::__function_requires<__gnu_cxx::_DefaultConstructibleConcept<char*>
>()
void __gnu_cxx::__function_requires<__gnu_cxx::_EqualityComparableConcept<char*>
>()
void __gnu_cxx::__function_requires<__gnu_cxx::_OutputIteratorConcept<char*,
char> >()
void __gnu_cxx::__function_requires<__gnu_cxx::_TrivialIteratorConcept<char*>
>()

> There's a paragraph of comments at the top of the file, but they look like
> a continuation of the license boilerplate, so they're easy to miss.

One of the comments here is:

  "We explicitly instantiate the initial set of symbols; compiling
   this file with -fimplicit-templates will take care of the rest for
   us."

It doesn't look like this was the case however!  If I go to my
libstdc++-v3 build directory (from within the gcc-3.3 direction, as
usual), and "make clean; make" I see concept-inst.cc compiled with
this line:

/build/eng-linux1/spencer/gcc-cross/sparc-sun-solaris2.8/build-gcc/gcc/xgcc
-shared-libgcc
-B/build/eng-linux1/spencer/gcc-cross/sparc-sun-solaris2.8/build-gcc/gcc/
-nostdinc++
-L/build/eng-linux1/spencer/gcc-cross/sparc-sun-solaris2.8/build-gcc/sparc-sun-solaris2.8/libstdc++-v3/src
-L/build/eng-linux1/spencer/gcc-cross/sparc-sun-solaris2.8/build-gcc/sparc-sun-solaris2.8/libstdc++-v3/src/.libs
-B/opt/gcc-3.3-cross/sparc-sun-solaris2.8/sparc-sun-solaris2.8/bin/
-B/opt/gcc-3.3-cross/sparc-sun-solaris2.8/sparc-sun-solaris2.8/lib/
-isystem
/opt/gcc-3.3-cross/sparc-sun-solaris2.8/sparc-sun-solaris2.8/include
-nostdinc++
-I/build/eng-linux1/spencer/gcc-cross/sparc-sun-solaris2.8/build-gcc/sparc-sun-solaris2.8/libstdc++-v3/include/sparc-sun-solaris2.8
-I/build/eng-linux1/spencer/gcc-cross/sparc-sun-solaris2.8/build-gcc/sparc-sun-solaris2.8/libstdc++-v3/include
-I../../../../../gcc-3.3/libstdc++-v3/libsupc++
-I../../../../../gcc-3.3/libstdc++-v3/libmath -fno-implicit-templates
-Wall -Wno-format -W -Wwrite-strings -fdiagnostics-show-location=once
-D_GLIBCPP_CONCEPT_CHECKS -fimplicit-templates -c
../../../../../gcc-3.3/libstdc++-v3/src/concept-inst.cc -o concept-inst.o

Note the "-fno-implicit-templates".   Looks like this is in the
Makefile.in in the libstdc++-v3 source directory:

AM_CXXFLAGS = \
        -fno-implicit-templates \
        $(LIBSUPCXX_CXXFLAGS) \
        $(WARN_CXXFLAGS) \
        $(OPTIMIZE_CXXFLAGS) \
        $(CONFIG_CXXFLAGS)  

Is this just wrong?  Or at least wrong for concept-inst.o?
   
> If you run nm on your_build_dir/src/.libs/concept-inst.o, what symbols do
> you see?

Here's the full list of symbols from concept-inst.o:

concept-inst.o:00000000 a *ABS*
concept-inst.o:00000034 t __atomic_add(int volatile*, int)
concept-inst.o:00000000 t __exchange_and_add(int volatile*, int)
concept-inst.o:00000000 V __Atomicity_lock<(int)0>::_S_atomicity_lock
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_ConvertibleConcept<unsigned, unsigned> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_InputIteratorConcept<char const*> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_InputIteratorConcept<char*> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_OutputIteratorConcept<std::ostreambuf_iterator<char, std::char_traits<char> >, char> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_LessThanComparableConcept<char*> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_LessThanComparableConcept<int> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_LessThanComparableConcept<long> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_LessThanComparableConcept<long long> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<char const*> >()
concept-inst.o:00000000 W void __gnu_cxx::__function_requires<__gnu_cxx::_RandomAccessIteratorConcept<char*> >()

-- 
------------------------------------------------------------------
Brad Spencer - spencer@infointeractive.com - "It's quite nice..."
Systems Architect | InfoInterActive Corp. | A Canadian AOL Company


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]