On 1/23/2015 9:55 AM, Jonathan Wakely wrote:
> On 22/01/15 16:07 -0600, Joel Sherrill wrote:
>> On 1/22/2015 3:44 PM, Marc Glisse wrote:
>>> On Thu, 22 Jan 2015, Joel Sherrill wrote:
>>>
>>>> I think this is a glibc issue but since this method is defined in the C++
>>>> standards, I thought there were plenty of language lawyers here. :)
>>> s/glibc/libstdc++/ and they have their own ML.
>>  Thank you.
>>>> <strstream>
>>> That's deprecated, isn't it?
>> Yes. There is also a warning about that coming from the test code.
>> I don't know how long it has been deprecated since even with
>> -std=c++03, the warning is present.
> Those types were deprecated even in the first C++ standard in 1998.
> They were born deprecated, and have remained so ever since.
I don't mind the deprecated warning but at least I know now how long they
have been that way. :)
>>>>   class strstreambuf : public basic_streambuf<char, char_traits<char> >
>>>>   ISSUE ====> int pcount() const;   <===== ISSUE
>>>>
>>>> My reading of the C++03 and draft C++14 says that the int pcount() method
>>>> in this class is not const. glibc has it const in the glibc shipped with
>>>> Fedora 20
>>>> and CentOS 6.
>>>>
>>>> This is a simple test case:
>>>>
>>>>    #include <strstream>
>>>>
>>>>    int main() {
>>>>        int (std::strstreambuf::*dummy)() = &std::strstreambuf::pcount;
>>>> /*-- pcount is conformant --*/
>>>>        return 0;
>>>>    }
>>>>
>>>> What's the consensus?
>>> The exact signature of member functions is not mandated by the standard,
>>> implementations are allowed to make the function const if that works (or
>>> provide both a const and a non-const version). Your code is not guaranteed
>>> to work. Lambdas usually provide a fine workaround.
>>>
>> This code is actually from the Open Group FACE Conformance Test Suite.
>> It uses code like this to check the presence of methods from the C Standard
>> Library, POSIX APIs, and the C++ Standard Library. It would be really
>> helpful
>> if you could cite the place in the C++ standard so I can provide that as
>> feedback
>> to the authors of the test suite.
> 17.6.5.5 [member.functions] gives implementors certain freedoms to
> provide slightly different signatures to those described in the
> standard, including this:
>
> -2- It is unspecified whether any member functions in the C++ standard
>     library are defined as inline (7.1.2). An implementation may
>     declare additional non-virtual member function signatures within a
>     class:
>    
>     — by adding arguments with default values to a member function
>     signature;(187)
>     — ...
>
>     187) Hence, the address of a member function of a class in the C++
>     standard library has an unspecified type.
>
> The footnote makes it clear that we could declare strstreambuf::pcount
> as a function with one or more parameters, as long as we give them
> default values, meaning that the type of &std::strstreambuf::pcount is
> not guaranteed to be int (strstreambuf::*)() in a conforming
> implementation, so the conformance test could fail on an
> implementation that conforms 100% to the standard.
>
> I'm not sure if that gives us the liberty to add 'const' where the
> standard doesn't have it, so this might be a real non-conformance
> issue, but even if we fixed it their test is not guaranteed to work
> for other reasons.
>
Thank you for the explanation.

Sounds like every place this technique flags a method, it cannot be an
automatic fail but will need manual examination to at least check for
defaulted arguments.

I am curious what the ruling is on the const. Since the answer will
impact FACE's guidance for its test suite.

Is there a better way to automate a signature compliance? To tweak
what they have done?

>> On a positive note, the test suite isn't flagging much using this
>> technique. This
>> may be the only method. But I would like to provide the correct feedback to
>> them so no one else deals with this.
> IMHO the correct feedback for these deprecated types might be "Hmm,
> you're right. Oh well, nevermind, we're not going to bother fixing it
> now."
>
> Any real program using the pcount() member will work correctly with
> our implementation. In practice only conformance tests are likely to
> notice the difference.
>

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherr...@oarcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985


Reply via email to