https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89605

            Bug ID: 89605
           Summary: A method cannot have two identical lambdas as default
                    arguments
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xavier at cremaschi dot fr
  Target Milestone: ---

$ g++ --version
g++ (Debian 8.2.0-21) 8.2.0


The following code does not compile : 

#include <string>
#include <functional>
#include <iostream>

using namespace std;

class S {
    public:
        using ConverterFunction = function<double(double)>;

        void _foo(
                const ConverterFunction& converter = [](double value) -> double
{ return value; },
                const ConverterFunction& converterBack = [](double value) ->
double { return value; }
                );
};


void S::_foo(
        const ConverterFunction& converter,
        const ConverterFunction& converterBack)
{
    cout << "foo " << converter(42) << endl;
}

int main() {
    S s;
    s._foo();
    return 0;
}



It triggers the following error :

/tmp/ccW5xjuM.s: Assembler messages:
/tmp/ccW5xjuM.s:183: Error: symbol
`_ZZN1S4_fooERKSt8functionIFddEES4_Ed_NKUldE_clEd' is already defined
/tmp/ccW5xjuM.s:514: Error: symbol
`_ZSt4moveIRZN1S4_fooERKSt8functionIFddEES5_Ed_UldE_EONSt16remove_referenceIT_E4typeEOS9_'
is already defined
/tmp/ccW5xjuM.s:534: Error: symbol
`_ZNSt8functionIFddEEC2IZN1S4_fooERKS1_S5_Ed_UldE_vvEET_' is already defined
/tmp/ccW5xjuM.s:788: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E21_M_not_empty_functionIS7_EEbRKT_'
is already defined
/tmp/ccW5xjuM.s:807: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E15_M_init_functorERSt9_Any_dataOS7_'
is already defined
/tmp/ccW5xjuM.s:836: Error: symbol
`_ZNSt17_Function_handlerIFddEZN1S4_fooERKSt8functionIS0_ES5_Ed_UldE_E9_M_invokeERKSt9_Any_dataOd'
is already defined
/tmp/ccW5xjuM.s:873: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E10_M_managerERSt9_Any_dataRKS9_St18_Manager_operation'
is already defined
/tmp/ccW5xjuM.s:1099: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E15_M_init_functorERSt9_Any_dataOS7_St17integral_constantIbLb1EE'
is already defined
/tmp/ccW5xjuM.s:1129: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E14_M_get_pointerERKSt9_Any_data'
is already defined
/tmp/ccW5xjuM.s:1156: Error: symbol
`_ZNSt9_Any_data9_M_accessIPZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_EERT_v' is
already defined
/tmp/ccW5xjuM.s:1178: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E8_M_cloneERSt9_Any_dataRKS9_St17integral_constantIbLb1EE'
is already defined
/tmp/ccW5xjuM.s:1208: Error: symbol
`_ZNSt14_Function_base13_Base_managerIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_E10_M_destroyERSt9_Any_dataSt17integral_constantIbLb1EE'
is already defined
/tmp/ccW5xjuM.s:1297: Error: symbol
`_ZNKSt9_Any_data9_M_accessIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_EERKT_v' is
already defined
/tmp/ccW5xjuM.s:1319: Error: symbol
`_ZSt11__addressofIKZN1S4_fooERKSt8functionIFddEES5_Ed_UldE_EPT_RS8_' is
already defined
/tmp/ccW5xjuM.s:1339: Error: symbol
`_ZNSt9_Any_data9_M_accessIZN1S4_fooERKSt8functionIFddEES6_Ed_UldE_EERT_v' is
already defined



The exact same code compiles with clang++-6.0 or MSVC (Visual Studio 2017
15.9.4).
It also compiles with g++ as soon as implementation is inlined in class
definition.

Reply via email to