[ This message is being sent to perl-xs@perl.org seeking suggestions,
with a CC to inl...@perl.org as an FYI. ]

We have a situation with Inline::CPP wherein the module is failing to
pass smoke testing when the compiler is g++ version 4.4.3 (though I
think the issue probably goes back to 4.2.1).  Here is an example of
two failure reports:

http://www.cpantesters.org/cpan/report/35702916-59fc-11e1-8417-42773f40e7b5
http://www.cpantesters.org/cpan/report/afd08dc8-59fb-11e1-8417-42773f40e7b5

The CPAN Testers Results Overview (statistical analysis) shows a
strong correlation between g++ v4.4.3 and failure.
http://analysis.cpantesters.org/solved?distv=Inline-CPP-0.34_002#conf%3Agccversion

The error message that I think is most relevant from those reports
looks like this:

_01basic_t_5cd2b57.c:212: error: invalid use of ‘static’ in
linkage specification

There will be many of these messages -- one for each C++ function (or
object method in this case) that fails to compile.  As I've
investigated a possible reason for this I keep bumping into
explanations (on StackOverflow, Usenet, etc.) that there cannot be two
storage class specifiers for any given function.  In other words, in
"Standard C++", you cannot have:

extern "C" void static mysub ( int something );

Because both 'extern "C"' and 'static' are storage class specifiers.
One workaround is this:

extern "C" { void static mysub ( int something ); }

Now frankly I don't know EU::ParseXS's code well at all, and haven't
walked through it.  But it seems like it probably should be wrapping
static functions in an

extern "C" { ...... }

block rather than just prepending

extern "C"

The question might come up "Why are only two of a couple hundred smoke
tests failing on this issue?"  I think that the answer is that
starting with g++ v4.1.2 this aspect of "Standard" C++ began to be
enforced.  I can't find any command-line flags to disable it, but it
seems that it's a problem that will probably get worse as more g++
users migrate to newer versions.  That said, I'm actually using a
4.4.x version of g++ on one of my systems and cannot duplicate the
failure... bad luck for me, I guess; I'd really like to personally get
my hands on a failure so that I can try to fix it locally first.

It's entirely possible that I'm barking up the wrong tree.  When using
Inline::CPP there are many layers involved that separate user code
from final product.  Inline::CPP subclasses Inline::C, and uses Inline
(as does Inline::C).  They rely on Parse::RecDescent, and Inline
relies on ExtUtils::ParseXS.  It's possible I've missed something in
Inline::CPP's code, or in how Inline::C and Inline deal with the
Inline::CPP.  But there's one module that is ultimately connected with
the .c output from the .xs output of Inline, and that's EU::ParseXS,
and that module is the one generating the actual 'extern "C"' linkage
modifier, so here I am.

If anyone has any idea on what should happen next... whether
EU::ParseXS needs some help, or whether I should be digging more into
Inline::CPP and Inline's source, I'd appreciate some suggestions.

Dave Oswald

-- 

David Oswald
daosw...@gmail.com
dav...@cpan.org

Reply via email to