Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compiler Bug in Visual C++ 10.0 SP1 - cl.exe version 16.0.40219.1 Access violation [confirmed]

I have ran into a problem compiling some template code with Visual Stuido 2010 SP1, cl.exe version 16.0.40219.1

The following code will cause the compiler to access violate:

template<typename T>
class A
{
    A(){}
};

template<typename T>
class B : public A<T>
{
    using A::A(); // Compiler access violates
    // **EDIT**
    //using A<T>::A<T>; // Compiler succeeds
    //using A<T>::A(); // Compiler reports error
};

int main(int argc, char* argv[])
{
    return 0;
}

It generates the following error (in addition to the "cl.exe has stopped working, C0000005 exception):

1>d:\projects\cpptest\cpptest\cpptest.cpp(11): fatal error C1001: An internal error has occurred in the compiler.
1>  (compiler file 'msc1.cpp', line 1420)
1>   To work around this problem, try simplifying or changing the program near the locations listed above.

The code compiles fine (well, that is, it emits a proper error message and doesn't crash the compiler) in Dev-C++ with g++.

main.cpp:11: error: `template<class T> class A' used without template parameters
main.cpp:11: error: expected nested-name-specifier before "A"
main.cpp:11: error: using-declaration for non-member at class scope
main.cpp:11: error: expected `;' before '(' token
main.cpp:11: error: expected unqualified-id before ')' token
make.exe: *** [main.o] Error 1

EDIT The following, however, compiles fine, without access violation, so it seems this is related to templates:

class A
{
    A(){}
};

class B : public A
{
    using A::A;
};

int main(int argc, char* argv[])
{
    return 0;
}

Do you think this is worth reporting to Microsoft? Can anyone else reproduce this? Maybe try in Visual Studio 2013 to see if it still occurs?

like image 523
namezero Avatar asked Sep 12 '13 13:09

namezero


1 Answers

Since this is reproducible by others on Visual C++ platforms, I have opened a bug report on Microsoft Connect as "answer".

Also, as workaround, the following syntax works:

using A<T>::A<T>;
like image 167
namezero Avatar answered Nov 20 '22 11:11

namezero