[ 
https://issues.apache.org/jira/browse/STDCXX-605?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Travis Vitek updated STDCXX-605:
--------------------------------

    Attachment: stdcxx-605-v2.patch
                stdcxx-605-v1.patch

In the failure you mention, the conversion we want is to `const int&'. The 
conversion operator that gets invoked is the non-const `operator T&'  with 'T' 
being 'const int'. That conversion operator calls the non-const retrieve(), 
which keeps the const and looks in the static dynatype::map<const int> for a 
value. We should be looking in dynatype::map<int>, but the const is not being 
stripped.

Consider the following...

struct S
{
private:
    template <class T> int g (T*) { return 0; }
    template <class T> int g (const T*) const { return 1; }
public:
    template <class T> int f () { return g ((T*)0); }
};

int main ()
{
    const int a = S().f<int>();
    const int b = S().f<const int>();

    return (a << 1) | b;
}

I believe that the expected result is 0. When compiling the S().f<const int>(), 
I see a few candidate functions for overload resolution. Given that the 
overload resolution system treats member functions as if they were free 
functions with a correctly cv-qualified implicit object parameter, the 
candidates would seem to be

    int S_g(S&, int*);
    int S_g(S&, const int*);

from the first template, and 

    int S_g(const S&, int*);
    int S_g(const S&, const int*);

from the second. The actual type of the call is

    ??? S_g(S&, const int*);

So the best match is easily selected, and the result is a call to the non-const 
'g' template, which leaves the const on the template type T instead of 
stripping it like we want.

Continuing with the example, I see a few options. We could make both 'g' 
overloads share the same constness. If we make them have the same constness, 
then the overload resolution chooses the best match based on the explicit 
parameter type, and then discards const as we want. The disadvantage of this is 
that we would either have two const overloads of 'g' [which you didn't appear 
to like], or we can have two non-const overloads and cast away const when 
calling from a const member function. A third option would be to make both 'g' 
overloads into non-member functions that takes const S* [essentially the same 
as making both members const], but that would require some code rearranging.

Personally I thought that the two const retrieve() overloads was the simplest 
and cleanest solution [stdcxx-605-v2.patch]. The most recent patch involves 
changing fewer lines of code in the example, but it leaves a nasty static/const 
cast [stdcxx-605-v1.patch].

> [IBM XLC++] errors compiling dynatype.cpp
> -----------------------------------------
>
>                 Key: STDCXX-605
>                 URL: https://issues.apache.org/jira/browse/STDCXX-605
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: Examples
>    Affects Versions: 4.2.0
>         Environment: XLC++ 6.0 through 9.0/AIX 5.3
>            Reporter: Martin Sebor
>            Assignee: Travis Vitek
>             Fix For: 4.2.1
>
>         Attachments: stdcxx-605-v1.patch, stdcxx-605-v2.patch
>
>
> The dynatype.cpp example program fails to compile with IBM XLC++ 9.0 on AIX 
> with ethe following errors:
> xlCcore_r -c -I$(TOPDIR)/include/ansi    -I$(TOPDIR)/include 
> -I$(BUILDDIR)/include -I$(TOPDIR)/examples/include  -O -Q     
> -qtemplateregistry=dynatype.ti $(TOPDIR)/examples/tutorial/dynatype.cpp
> "$(TOPDIR)/examples/tutorial/dynatype.cpp", line 203.27: 1540-0216 (S) An 
> expression of type "dynatype" cannot be converted to type "int".
> "$(TOPDIR)/examples/tutorial/dynatype.cpp", line 209.30: 1540-0216 (S) An 
> expression of type "dynatype" cannot be converted to type "double".
> "$(TOPDIR)/examples/tutorial/dynatype.cpp", line 215.30: 1540-0216 (S) An 
> expression of type "dynatype" cannot be converted to type "double".
> "$(TOPDIR)/examples/tutorial/dynatype.cpp", line 222.35: 1540-0216 (S) An 
> expression of type "dynatype" cannot be converted to type "const char *".
> "$(TOPDIR)/examples/tutorial/dynatype.cpp", line 228.35: 1540-0216 (S) An 
> expression of type "dynatype" cannot be converted to type "const char *".
> "$(TOPDIR)/examples/tutorial/dynatype.cpp", line 238.28: 1540-0216 (S) An 
> expression of type "dynatype" cannot be converted to type "char".
> gmake: *** [dynatype.o] Error 1

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

Reply via email to