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

            Bug ID: 79192
           Summary: Angle bracket following typename is treated as
                    template argument delimiter even if the name is not a
                    template name
           Product: gcc
           Version: 6.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ricilake at gmail dot com
  Target Milestone: ---

Sample code:

    #include <iostream>
    struct v {};
    int main() {
      std::cout << __VERSION__ << '\n' << (new v < new v) << '\n';
    }

(Or, more simply):

    int main() { return new int < new int; }

Standard reference: ยง14.2 paragraph 3:

  After name lookup finds that a name is a template-name or that an operator-
  function-id or a literal-operator-id refers to a set of overloaded functions
  any member of which is a function template, if this is followed by a <, the <
  is always taken as the delimiter of a template-argument-list and never as the
  less-than operator.

In this case, however, the name is *not* a template-name, so I believe that the
< should be the less-than operator. Clang also believes this.

Initially ventilated on StackOverflow
http://stackoverflow.com/q/41786026/1566221 where the consensus appears to be
that it's a bug.

As mentioned in the SO post, I also tried it with function names ("&f < &f"),
and in that case GCC does distinguish between template names and non-template
names, so the behaviour of "new v < new v" seems doubly inconsistent.

Reply via email to