VC++ 10: Interner Compilerfehler



  • Guten Abend,

    Code mit einer NonCopyable -Basisklasse führt unter Visual Studio 2010 zu einem internen Compilerfehler. Ich kompiliere im Debug-Modus und erstelle eine dynamische Bibliothek. Ich habe ein komplett neues Projekt erstellt und in den Eigenschaften nur den Konfigurationstyp auf DLL gesetzt. Den Code habe ich soeben in eine neue .cpp-Datei abgetippt, um das Copy&Paste irgendwelcher Steuerzeichen zu verhindern.

    Minimaler Code:

    #include <vector>
    
    #pragma warning(disable:4251) // std::vector DLL interface
    #define MY_API __declspec(dllexport)
    
    struct MY_API NonCopyable
    {
    	NonCopyable() {}
    private:
    	NonCopyable(const NonCopyable&);
    	NonCopyable& operator= (const NonCopyable&);
    };
    
    struct MY_API MyClass : NonCopyable
    {
    	MyClass(int) {}
    
    	std::vector<float> v;
    };
    
    MyClass function(int i)
    {
    	return MyClass(i);
    }
    

    Compiler-Ausgabe:

    1>------ Erstellen gestartet: Projekt: SimpleDLL, Konfiguration: Debug Win32 ------
    1>  Problem.cpp
    1>c:\...\simpledll\problem.cpp(23): fatal error C1001: Interner Compilerfehler.
    1>  (Compilerdatei "f:\dd\vctools\compiler\utc\src\p2\ehexcept.c", Zeile 1473)
    1>   Vereinfachen oder ändern Sie das Programm im Umfeld der oben aufgeführten Positionen. Wählen 
    1>  Sie im Menü "Hilfe" von Visual C++ den Befehl "Technischer Support", 
    1>  oder öffnen Sie die Hilfedatei des technischen Supports, um weitere Informationen zu erhalten.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Mit Warnlevel 4 erhalte ich zusätzlich folgende Warnung:

    c:\...\simpledll\problem.cpp(21): warning C4100: 'i': Unreferenzierter formaler Parameter
    

    Verwende ich in function() eine benannte Variable, funktioniert alles. Interessant ist auch die Ausgabe, wenn ich die std::vector -Deklaration weglasse. Dann kommt:

    1>------ Neues Erstellen gestartet: Projekt: SimpleDLL, Konfiguration: Debug Win32 ------
    1>  Problem.cpp
    1>c:\...\simpledll\problem.cpp(22): error C4716: 'function': Muss einen Wert zurückgeben
    ========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========
    

    Ich dachte zuerst, es könnte mit Most Vexing Parse zu tun haben, dagegen spricht allerdings, dass ein static_cast<int>(i) als Konstruktorargument ebenfalls zu C1001, C4100 und C4716 führt.

    Mir ist bewusst, dass der Code wegen der Kopie nicht kompilieren sollte. Ich hätte aber eine entsprechende Fehlermeldung erwartet, und keinen Compilerabsturz oder eine völlig andere Fehlermeldung.



  • Dürfte ein Compilerbug sein, VS 2010 stürzt bei mir auch ab, VS 2012 kompiliert es aber anstandslos. Abgesehen davon, würd ich dir aber empfehlen, eine englische Version von Visual Studio zu verwenden, da die deutsche Übersetzung des Compilers desöfteren genau solche Abstürze hinlegt, wo die englische Version zumindest eine sinnvolle Fehlermeldung liefert...



  • dot schrieb:

    Dürfte ein Compilerbug sein

    Bei einem Absturz/internen Fehler sehe ich nicht viel Interpretationsspielraum 🙂

    dot schrieb:

    VS 2010 stürzt bei mir auch ab, VS 2012 kompiliert es aber anstandslos.

    Können das eventuell andere bestätigen? Sollte ich also keinen Bugreport schreiben?

    dot schrieb:

    Abgesehen davon, würd ich dir aber empfehlen, eine englische Version von Visual Studio zu verwenden, da die deutsche Übersetzung des Compilers desöfteren genau solche Abstürze hinlegt, wo die englische Version zumindest eine sinnvolle Fehlermeldung liefert...

    Wirklich? Sind Compiler und Ausgabe nicht schön getrennt?


  • Mod

    Ich bekomme den gleichen Fehler.
    Evtl. solltest Du den Bug doich auf connect veröffentlichen. Dan wird er wenigstens auch anderen bekannt.
    Gefixed wird er mit Sicherheit nicht mehr.



  • Nimmt Microsoft überhaupt noch Bugreports für VS 2010 entgegen? Wenn ich auf http://connect.microsoft.com/VisualStudio auf "Submit Bug" klicke, kann ich im anschliessenden Formular nur VS 2012 auswählen...

    Mit dem VC++11-Compiler tritt der Fehler also nicht mehr auf?



  • Nexus schrieb:

    Mit dem VC++11-Compiler tritt der Fehler also nicht mehr auf?

    Naja, zumindest dein obiges Minimalbeispiel kompiliert fehlerfrei...vom Linkerfehler wegen der fehlenden main() Funktion mal abgesehen... 😉



  • Ist ja auch eine DLL 😉

    Gibt es keine Bugreports für VC++10 mehr?


Anmelden zum Antworten