stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Sebor (JIRA)" <j...@apache.org>
Subject [jira] Commented: (STDCXX-737) Configure tests might be compiled twice.
Date Thu, 21 Feb 2008 00:45:43 GMT

    [ https://issues.apache.org/jira/browse/STDCXX-737?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12570909#action_12570909
] 

Martin Sebor commented on STDCXX-737:
-------------------------------------

Here's the relevant output of the config step:
{noformat}
checking for instantiation before definition       ok
checking for explicit instantiation with implicit  no (_RWSTD_NO_EXPLICIT_INSTANTIATION_WITH_IMPLICIT_INCLUSION)
checking for explicit instantiation of members     ok
checking for explicit member specialization        ok
checking for exported templates                    no (_RWSTD_NO_EXPORT)
checking for the export keyword                    ok
checking for compatibility of extern "C" and "C++" ok
checking for exceptions from extern "C" functions  ok
checking overloading on extern "C"                 no (_RWSTD_NO_EXTERN_C_OVERLOAD)
checking for extern function template extension    no (_RWSTD_NO_EXTERN_FUNCTION_TEMPLATE)
{noformat}

The listing below distilled from {config.log} shows the order in which config tests (.cpp
and .o) files get processed. The ones marked {{[E]}} indicate an error at the respective step
(compilation for .cpp or linking for .o):
{noformat}
[E] IMPLICIT_INCLUSION.o
[E] EXTERN_FUNCTION_TEMPLATE.cpp
    EXPLICIT_INSTANTIATION_BEFORE_DEFINITION.cpp
[E] EXPLICIT_INSTANTIATION_WITH_IMPLICIT_INCLUSION.cpp
    EXPLICIT_MEMBER_INSTANTIATION.cpp
    EXPLICIT_MEMBER_SPECIALIZATION.cpp
    EXPORT_KEYWORD.cpp
[E] EXPORT.o
    EXTERN_C_COMPATIBILITY.cpp
    EXTERN_C_EXCEPTIONS.cpp
[E] EXTERN_C_OVERLOAD.cpp
    EXTERN_FUNCTION_TEMPLATE.cpp
{noformat}

What I suspect happens is that the processing starts with {{EXPLICIT_INSTANTIATION_BEFORE_DEFINITION.cpp}}.
The test references the
{{_RWSTD_NO_IMPLICIT_INCLUSION}} and {{_RWSTD_NO_EXTERN_FUNCTION_TEMPLATE}} macros so the
configuration recurses to process those tests first. First, {{IMPLICIT_INCLUSION.o}} fails
to link because gcc doesn't support implicit inclusion and the macro gets appended to {{config.h}}.
Next, {{EXTERN_FUNCTION_TEMPLATE}} is processed. It references the {{_RWSTD_NO_extern_function_template_imp}}
macro, so the {{extern_function_template_imp.cpp}} must be compiled. The compilation is successful.
Finally, {{EXTERN_FUNCTION_TEMPLATE.cpp}} must be built. The compilation is successful but
the linking fails because, as Farid says, the link line is missing the {{extern_function_template_imp.o}}
file:

{noformat}
gcc $CXXFLAGS -c $TOPDIR/etc/config/src/EXTERN_FUNCTION_TEMPLATE.cpp -o EXTERN_FUNCTION_TEMPLATE.o
gcc EXTERN_FUNCTION_TEMPLATE.o -lsupc++ -o EXTERN_FUNCTION_TEMPLATE
EXTERN_FUNCTION_TEMPLATE.o: In function `main':
$TOPDIR/etc/config/src/EXTERN_FUNCTION_TEMPLATE.cpp:47: undefined reference to `S<int>
foobar<int>(S<int>)'
collect2: ld returned 1 exit status
{noformat}

> Configure tests might be compiled twice.
> ----------------------------------------
>
>                 Key: STDCXX-737
>                 URL: https://issues.apache.org/jira/browse/STDCXX-737
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: Configuration
>    Affects Versions: 4.1.2, 4.1.3, 4.1.4, 4.2.0
>         Environment: unix
>            Reporter: Farid Zaripov
>            Assignee: Martin Sebor
>
> From http://www.nabble.com/forum/Permalink.jtp?root=15579207&post=15593021&page=y
:
>   I made this change in GNUmakefile because the
> EXTERN_FUNCTION_TEMPLATE.cpp
> config test has compiled twice on my gcc/Linux:
> 1) first it was not linked with extern_function_template_imp.o and due
> to this
> the macro _RWSTD_NO_EXTERN_FUNCTION_TEMPLATE is defined in config.h
> config.log:
> ---------
> ...
> gcc -D_RWSTDDEBUG -pthread -I. -pedantic -nostdinc++ -g  -W -Wall
> -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long
> -Wcast-align  -c
> /usr/src/trunk/etc/config/src/extern_function_template_imp.cpp -o
> extern_function_template_imp.o
> gcc -D_RWSTDDEBUG -pthread -I. -pedantic -nostdinc++ -g  -W -Wall
> -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long
> -Wcast-align  -c
> /usr/src/trunk/etc/config/src/EXTERN_FUNCTION_TEMPLATE.cpp -o
> EXTERN_FUNCTION_TEMPLATE.o
> gcc EXTERN_FUNCTION_TEMPLATE.o -pthread  -lm -lsupc++  -o
> EXTERN_FUNCTION_TEMPLATE
> EXTERN_FUNCTION_TEMPLATE.o(.text+0x26): In function `main':
> /usr/src/trunk/etc/config/src/EXTERN_FUNCTION_TEMPLATE.cpp:47: undefined
> reference to `S<int> foobar<int>(S<int>)'
> collect2: ld returned 1 exit status
> ...
> ---------
> config.h:
> ---------
> ...
> // #define _RWSTD_NO_extern_function_template_imp
> #define _RWSTD_NO_EXTERN_FUNCTION_TEMPLATE
> ...
> ---------
> 2) second it was linked with extern_function_template_imp.o and the
> config.h contains the second entry, where
> _RWSTD_NO_EXTERN_FUNCTION_TEMPLATE define is commented
> config.log:
> ---------
> ...gcc -D_RWSTDDEBUG -pthread -I. -pedantic -nostdinc++ -g  -W -Wall
> -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long
> -Wcast-align  -c
> /usr/src/trunk/etc/config/src/EXTERN_FUNCTION_TEMPLATE.cpp -o
> EXTERN_FUNCTION_TEMPLATE.o
> gcc EXTERN_FUNCTION_TEMPLATE.o -pthread extern_function_template_imp.o
> -lm -lsupc++  -o EXTERN_FUNCTION_TEMPLATE
> ./EXTERN_FUNCTION_TEMPLATE
> ...
> ---------
> config.h:
> ---------
> ...
> // #define _RWSTD_NO_EXTERN_FUNCTION_TEMPLATE
> ...
> ---------
>   As a result the _RWSTD_NO_EXTERN_FUNCTION_TEMPLATE macro is defined
> while gcc supports the extern function templates.
>   The first compilation is come from "%.o: %.cpp" rule, and the second -
> from "config:" rule. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message