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

             Bug #: 53926
           Summary: g++ fails to compile valid template code with casting
                    to QVariant and back
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: a.matveya...@gmail.com


Trying to compile the following code:

#include <QtCore/QSettings>

template <typename T>
void bug (const T& default_value)
{
  QSettings settings;
  settings.value ("foo", default_value).value <T> ();
}

results in compilation failure:

$ gcc -I/usr/include/qt4 -c gcc-bug.cpp 
gcc-bug.cpp: In function ‘void bug(const T&)’:
gcc-bug.cpp:7:49: error: expected primary-expression before ‘>’ token
gcc-bug.cpp:7:52: error: expected primary-expression before ‘)’ token


The error can be reproduced in a small code piece without any includes:

class Variant
{
public:
  Variant (int) { }

  template <typename T>
  T value () const { return T (); }
};

template <typename T>
Variant get_variant (const T& x)
{
  return Variant (x);
}

template <typename T>
void bug (const T& x)
{
  get_variant (x).value <T> ();
}

$ gcc -I/usr/include/qt4 -c gcc-bug.cpp 
gcc-bug.cpp: In function ‘void bug(const T&)’:
gcc-bug.cpp:19:27: error: expected primary-expression before ‘>’ token
gcc-bug.cpp:19:30: error: expected primary-expression before ‘)’ token


Splitting the line

get_variant (x).value <T> ();

into

Variant tmp = get_variant (x);
tmp.value <T> ();

eliminates the error.


The error is reproducible in 4.2.4, 4.5.1, 4.6.3 and 4.8.1 prerelease versions.

ICC & MSVC compile these examples without errors or warnings.

Reply via email to