MSVC 8.0 SP1 Compiler Bug oder dummer bär?



  • Kann mir einer erklären wieso im folgenden Beispiel viele hübsche C3861 fliegen?

    #include <typeinfo> // header 'typeinfo' defines class 'type_info' - C++ is seriously fucked up :)
    
    namespace nsa {
    
    	struct a
    	{
    		a(){}
    		a operator + (int) { return a(); }
    	};
    
    	int get(a const&)
    	{
    		return 0;
    	}
    
    } // namespace a
    
    int main()
    {
    	nsa::a a;
    
    	get(a); // OK
    	get(a + 1); // OK
    	get(a + *typeid(int).name()); // OK
    
    	get(a + *typeid(int(2)).name()); // C3861
    	get(a + *typeid(a).name()); // C3861
    	get(a + *static_cast<std::type_info const&>(typeid(int(2))).name()); // C3861
    	get(a + *static_cast<std::type_info const*>(&typeid(int(2)))->name()); // C3861
    
    	std::type_info const& ti = typeid(int(2));
    	get(a + *ti.name()); // OK. WTF?!?
    
    	get(a + *typeid(&a).name()); // C3861
    	get(a + *typeid(*&a).name()); // C3861
    	get(a + *typeid(static_cast<nsa::a*>(0)).name()); // C3861
    
    	return 0;
    }
    

    Ich gehe mal stark davon aus dass es ein Compiler Bug ist. Drübergestolpert bin ich bei boost::format(), wollte eben den Typ einer Exception rausloggen.
    Comeau Online frisst den Code ohne Probleme.

    Kennt jmd. das Phänomen?

    p.S.: mit Angabe des Namespace (nsa::get(...)) findet VC die get() Funktion immer.



  • Hab keine AHnung was Du hier machst, aber poste es mal hier:
    http://connect.microsoft.com/VisualStudio/feedback/



  • Ich würd sagen falsches Unterforum, im C++ Forum kennt man sich damit viel besser aus.



  • Hab keine AHnung was Du hier machst

    Ich habe nur versucht ein minimales Beispiel zu konstuieren. Du kannst den Fehler auch so bekommen (das war auch der Fall wo ich drübergestolpert bin):

    #include <exception>
    #include <boost/format.hpp>
    
    std::string get_exception_info(std::exception const& e)
    {
    	// boost::str() sollte hier über ADL (koenig lookup) gefunden werden,
    	// was aber MSVC auf Grund des typeid() Aufrufs nichtmehr checkt.
    	// Wenn du typeid(e) durch typeid(int) ersetzt geht es.
    	// (typeid(type) scheint kein problem zu machen, typeid(instance) dagegen schon)
    	return str(boost::format(
    			"type: %1% message: %2%")
    		% typeid(e).name()
    		% e.what());
    }
    

    p.S.: MSVC 2008 (9.0) macht genau dasselbe wie MSVC 2005 (8.0)



  • Hast Du es schon auf Connect gepostet?
    Oder am besten den MS Produkt-Support anrufen!


Log in to reply