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

            Bug ID: 71052
           Summary: Use of Range Based For Loop in unsupported dialect
                    results in malformed code
           Product: gcc
           Version: 5.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dengel at synopsys dot com
  Target Milestone: ---

Using GCC 5.1 if range based for loop is present and we are not compiling in
c++11 or gnu++11 mode some weird behavior is observed.

Upon compilation, we are met with a warning, however, we compile successfully
and the resulting code is broken. The below code snippet compiles and runs as
expected in c++11 mode, but in c++98 mode we see a warning, and the resulting
binary loops infinitely.

Reproducer:

$ cat t.cpp
int arr[10] = { 0 };
void foo() {
    for (int i: arr) { 
    }
}
$ g++ -c -std=c++98 -O0 t.cpp
t.cpp: In function ‘void foo()’:
t.cpp:3:17: warning: range-based ‘for’ loops only available with -std=c++11 or
-std=gnu++11
     for (int i: arr) { 
                 ^
$ objdump -d t.o

t.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <_Z3foov>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   eb fe                   jmp    4 <_Z3foov+0x4>

Reply via email to