[Bug c++/84469] New: [7/8 Regression] GCC rejects valid code in structured binding in range-based-for in template

benni.buch at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Feb 19 16:15:00 GMT 2018


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

            Bug ID: 84469
           Summary: [7/8 Regression] GCC rejects valid code in structured
                    binding in range-based-for in template
           Product: gcc
           Version: 8.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: benni.buch at gmail dot com
  Target Milestone: ---

struct A{
    template < typename T >
    void f()const{}
};

template < typename >
void foo(){
    A a[1][1];
    for(auto const& [b]: a){
        b.f< int >();
    }
}

int main(){
    foo< int >();
}


Is a valid program.

$ g++ -std=c++17 main.cpp 
main.cpp: In function 'void foo()':
main.cpp:10:14: error: expected primary-expression before 'int'
         b.f< int >();
              ^~~
main.cpp:10:13: error: expected ';' before 'int'
         b.f< int >();
             ^~~~
             ;
$ g++ --version
g++ (GCC) 8.0.1 20180219 (experimental)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++-7 -std=c++17 main.cpp 
main.cpp: In function 'void foo()':
main.cpp:10:14: error: expected primary-expression before 'int'
         b.f< int >();
              ^~~
main.cpp:10:14: error: expected ';' before 'int'
$ g++-7 --version
g++ (GCC) 7.3.1 20180216
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


It is accepted without the structured binding:

struct A{
    template < typename T >
    void f()const{}
};

template < typename >
void foo(){
    A a[1];
    for(auto const& b: a){
        b.f< int >(); // OK
    }
}

int main(){
    foo< int >();
}


More information about the Gcc-bugs mailing list