www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 15529] New: opEquals(string) conflicts with

https://issues.dlang.org/show_bug.cgi?id=15529

          Issue ID: 15529
           Summary: opEquals(string) conflicts with opEquals(const(char)*)
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: code benjamin-thaut.de

The following piece of code fails to compile in dmd 2.069.1

import core.stdc.string;

struct StringWrapper
{
    string str;

    bool opEquals(string str) const
    {
        return this.str == str;
    }

    bool opEquals(const(char)* cStr) const
    {
        return this.str == cStr[0..strlen(cStr)];
    }
}

void main(string[] args)
{
    auto w = StringWrapper("test");

    assert(w == "test");
    assert(w == "test\0".ptr);
}

The error is:
/d233/f675.d(22): Error: overloads const bool(string str) and const
bool(const(char)* cStr) both match argument list for opEquals /d233/f675.d(22):
Error: f675.StringWrapper.opEquals called with argument types (string) matches
both: /d233/f675.d(7): f675.StringWrapper.opEquals(string str) and:
/d233/f675.d(12): f675.StringWrapper.opEquals(const(char)* cStr)

I assume this is due to the implicit conversion of a string literal into
const(char)*.

--
Jan 08 2016