[Ахтунг!] баг в MSVC 8.0
От: IROV..  
Дата: 03.10.07 13:30
Оценка: 118 (8)
Стоит SP1

class Foo
{
    void bar()
    { 
        barT<float>(); 
    }    

    template<class T> 
    void barT();
};

template<class T> 
void Foo::barT()
{

}

void main()
{
    for(int i = 0; i != 10; ++i);

    i = 0;
}


Как можно жить?
я не волшебник, я только учусь!
Re: [Ахтунг!] баг в MSVC 8.0
От: CreatorCray  
Дата: 03.10.07 14:19
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Стоит SP1

IRO>Как можно жить?
Ну for scope херит... Боян...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: [Ахтунг!] баг в MSVC 8.0
От: Кодт Россия  
Дата: 03.10.07 14:40
Оценка: 2 (2)
Здравствуйте, IROV.., Вы писали:

IRO>Стоит SP1

IRO>Как можно жить?

Прикольно! Внешнее определение шаблона члена-функции включает опцию /Zc:forScope- !
(А определение по месту объявления — нет).

Эффект заметен на примере
#include <iostream>

class Foo
{
public:
    void bar()
    { 
        barT<float>(); 
    }    
    template<class T> 
    void barT();
};

int i = 12345;

void f()
{
    for(int i = 0; i != 10; ++i);
    std::cout << i << std::endl;
}

template<class T> 
void Foo::barT()
{
    for(int i = 0; i != 10; ++i);
    std::cout << i << std::endl;
}

void g()
{
    for(int i = 0; i != 10; ++i);
    std::cout << i << std::endl;
}


void main()
{
    f();         // 12345
    Foo().bar(); // 12345
    g();         // 10
}

Причём до определения шаблона и в самом определении — действует дефолтное поведение forScope+.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: [Ахтунг!] баг в MSVC 8.0
От: Кодт Россия  
Дата: 03.10.07 14:46
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Ну for scope херит... Боян...


На боян — пожалуйста, ссылку в RSDN и MSDN
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: [Ахтунг!] баг в MSVC 8.0
От: Roman Odaisky Украина  
Дата: 03.10.07 18:58
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Прикольно! Внешнее определение шаблона члена-функции включает опцию /Zc:forScope- !

К>Причём до определения шаблона и в самом определении — действует дефолтное поведение forScope+.

Я подозреваю, что это связано с POI.

Опять доставать с пыльной полки #define for if(0); else for?
До последнего не верил в пирамиду Лебедева.
Re[3]: [Ахтунг!] баг в MSVC 8.0
От: Кодт Россия  
Дата: 03.10.07 19:35
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Я подозреваю, что это связано с POI.


разверни, пожалуйста
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: [Ахтунг!] баг в MSVC 8.0
От: _nn_ www.nemerleweb.com
Дата: 03.10.07 19:52
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Стоит SP1


IRO>
IRO>class Foo
IRO>{
IRO>    void bar()
IRO>    { 
IRO>        barT<float>(); 
IRO>    }    

IRO>    template<class T> 
IRO>    void barT();
IRO>};

IRO>template<class T> 
IRO>void Foo::barT()
IRO>{

IRO>}

IRO>void main()
IRO>{
IRO>    for(int i = 0; i != 10; ++i);

IRO>    i = 0;
IRO>}
IRO>


IRO>Как можно жить?


VC 9.0 Beta 2:
Ваш пример:
Compile:
a.cpp(26) : error C2065: 'i' : undeclared identifier



Пример Кодт-а:
Compile:
a.cpp(23) : warning C4258: 'i' : definition from the for loop is ignored; the definition from the enclosing scope is used
        a.cpp(22) : definition of 'i' ignored
        a.cpp(18) : definition of 'i' used
a.cpp(36) : warning C4258: 'i' : definition from the for loop is ignored; the definition from the enclosing scope is used
        a.cpp(35) : definition of 'i' ignored
        a.cpp(18) : definition of 'i' used
a.cpp(30) : warning C4258: 'i' : definition from the for loop is ignored; the definition from the enclosing scope is used
        a.cpp(29) : definition of 'i' ignored
        a.cpp(18) : definition of 'i' used
        a.cpp(12) : see reference to function template instantiation 'void Foo::barT<float>(void)' being compiled
Linking...


Output:
12345
12345
12345
Press any key to continue . . .


У меня VC8 при компиляции большого проекта падает на каждом шагу
Так что это еще ничего.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: [Ахтунг!] баг в MSVC 8.0
От: CreatorCray  
Дата: 04.10.07 06:03
Оценка:
Здравствуйте, Кодт, Вы писали:

CC>>Ну for scope херит... Боян...

К>На боян — пожалуйста, ссылку в RSDN и MSDN
Вроде бы тут http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100048
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: [Ахтунг!] баг в MSVC 8.0
От: Roman Odaisky Украина  
Дата: 04.10.07 19:58
Оценка:
Здравствуйте, Кодт, Вы писали:

RO>>Я подозреваю, что это связано с POI.


К> :???: разверни, пожалуйста


Я был неправ, это какой-то более другой баг:

// cl /c /Zc:forScope forScope.cpp
#pragma conform(forScope, show)
template <class T> void function1(T const &);
void function2() {
    function1(0);
}
template <class T> void function1(T const &) {}
#pragma conform(forScope, show)

Actual Results

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
forScope.cpp
forScope.cpp(1) : warning C4811: value of pragma conform(forScope, show) == true
forScope.cpp(11) : warning C4811: value of pragma conform(forScope, show) == false

Expected Results

forscope.cpp(1) : warning C4811: value of pragma conform(forScope, show) == true
forscope.cpp(11) : warning C4811: value of pragma conform(forScope, show) == true

До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.