http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56239



             Bug #: 56239

           Summary: parse error calling operator() on parenthesized

                    value-initialized temporary

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: e...@catmur.co.uk





From

http://stackoverflow.com/questions/14732132/global-initialization-with-temporary-function-object



Under gcc 4.8.0 (20130127):



struct S { int operator()(); };

int main() { (S())(); }



source.cpp:2:20: error: expected primary-expression before ')' token

 int main() { (S())(); }

                    ^



Motivation for parenthesizing the temporary is to use it in a constructor call:



struct S { int operator()(); };

struct T { T(int); };

int main() { T t((S())()); }



source.cpp:3:24: error: expected primary-expression before ')' token

 int main() { T t((S())()); }

                        ^



It appears that gcc is parsing the expression (S())() using production 5.4p2:



cast-expression:

    unary-expression

    ( type-id ) cast-expression



Since an empty pair of parentheses is not a cast-expression, this should

instead be parsed using 5.2p1:



postfix-expression:

    [...]

    postfix-expression ( expression-list[opt] )

    [...]

where the postfix-expression is (S()) and the expression-list is omitted.



Same error occurs in both C++03 and C++11 mode.



icc 13.0.1 has the same issue; clang 3.2 compiles it successfully.



Two workarounds are available: enclose (S()) in an extra pair of parentheses,

or use C++11 universal initialization syntax.

Reply via email to