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

            Bug ID: 64171
           Summary: Hang whilst printing error message on invalid code
           Product: gcc
           Version: 4.9.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jleahy+gcc at gmail dot com

Created attachment 34181
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34181&action=edit
full preprocessed source

The following code is invalid (the constness 'var' doesn't match), but the
compiler seems to enter an infinite loop whilst printing the error message.

I've attached full preprocessed source.

The target is x86_64-unknown-linux-gnu.

Code:

#include <unordered_map>

struct X {
    static X * fromString();

    X(int x, int y);

    static const std::unordered_map<int, X> var;
};


std::unordered_map<int, X> X::var = {
    {0, X(0, 0)},
};


X * X::fromString() {
    std::unordered_map<int, X>::iterator it = var.find(0);
    if (it == var.end()) return 0;
    return &(it->second);
}

Complete output: (upto point where compiler hangs)

bug.cpp:13:31: error: conflicting declaration 'std::unordered_map<int, X>
X::var'
 std::unordered_map<int, X> X::var = {
                               ^
bug.cpp:9:45: note: previous declaration as 'const std::unordered_map<int, X>
X::var'
     static const std::unordered_map<int, X> var;
                                             ^
bug.cpp:13:31: error: declaration of 'const std::unordered_map<int, X> X::var'
outside of class is not definition [-fpermissive]
 std::unordered_map<int, X> X::var = {
                               ^
bug.cpp: In static member function 'static X* X::fromString()':
bug.cpp:19:57: error: conversion from 'std::unordered_map<int,
X>::const_iterator {aka std::__detail::_Node_const_iterator<std::pair<const
int, X>, false, false>}' to non-scalar type 'std::unordered_map<int,
X>::iterator {aka std::__detail::_Node_iterator<std::pair<const int, X>, false,
false>}' requested
     std::unordered_map<int, X>::iterator it = var.find(0);
                                                         ^

Reply via email to