[C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 16.10.16 15:24
Оценка:
Минимальный пример:

using namespace System;

//#using <System.Core.dll>

class A
{
public:
    const wchar_t* F() { return L""; }
};

String^ readUnicodeString(A& msg)
{
    const wchar_t* text = msg.F();
    String^ str = gcnew String(text); // <<< ICE указывает сюда
    return str;
}

int main() {}


Компилятор VS 2008.

Если раскомментировать то получаем ICE.
Указывает на

1>fatal error C1001: An internal error has occurred in the compiler.
1>  (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c[0x6396E0DB:0x00000030]', line 182)
1>   To work around this problem, try simplifying or changing the program near the locations listed above.
1>  Please choose the Technical Support command on the Visual C++
1>   Help menu, or open the Technical Support help file for more information
1>  INTERNAL COMPILER ERROR in 'C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\CL.exe'
1>      Please choose the Technical Support command on the Visual C++
1>      Help menu, or open the Technical Support help file for more information


Со старым синтаксисом управляемого C++ всё компилируется без проблем.
Есть идеи как обойти ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 16.10.2016 17:18 _NN_ . Предыдущая версия .
Re: [C++/CLI] ICE при System.Core
От: zou  
Дата: 16.10.16 17:14
Оценка:
Здравствуйте, _NN_, Вы писали:

А почему нельзя просто Reference на System.Core в файл проекта добавить?
Re[2]: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 16.10.16 17:17
Оценка:
Здравствуйте, zou, Вы писали:

zou>Здравствуйте, _NN_, Вы писали:


zou>А почему нельзя просто Reference на System.Core в файл проекта добавить?


Это одно и тоже И получают ICE.

P.S.
Забыл добавить происходит с компилятором от VS 2008.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 16.10.16 19:40
Оценка:
Как оказалось можно ещё больше сократить код до вызова конструктор String:

using namespace System;

#using <System.Core.dll>

String^ make(const wchar_t* m) { return gcnew String(m); }

int main() {}


Конкретно этот пример обходится с добавлением __inline:

__inline String^ make(const wchar_t* m) { return gcnew String(m); }


Как и предыдущий:
#using <System.Core.dll>


class A 
{
public:
    const wchar_t* F() { return L""; }
};

__inline String^ X(A& msg)
{
    const wchar_t* text = msg.F();
    String^ str = gcnew String(text);
    return str;
}


Однако в более сложном коде это не помогает.
Похоже компилятор не может заинлайнить и валится.

Есть идеи как обойти ?

System.Core.dll нужен из-за System::Func, увы без него никак.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: [C++/CLI] ICE при System.Core
От: wl. Россия  
Дата: 18.10.16 11:27
Оценка:
Здравствуйте, _NN_, Вы писали:

а __forceinline сможет заинлайнить?
Re[3]: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 18.10.16 18:05
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Здравствуйте, _NN_, Вы писали:


wl.>а __forceinline сможет заинлайнить?


Простую функцию да, а вот у меня функции посложнее и там никак
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: [C++/CLI] ICE при System.Core
От: rm822 Россия  
Дата: 18.10.16 19:41
Оценка: 16 (1)
_NN>Есть идеи как обойти ?
попробуй штатный функционал
    inline System::String ^ ToString( PCWSTR value )
    {
        return System::Runtime::InteropServices::Marshal::PtrToStringUni((IntPtr)(void*)value);
    }
Re[3]: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 18.10.16 20:05
Оценка:
Здравствуйте, rm822, Вы писали:

_NN>>Есть идеи как обойти ?

R> попробуй штатный функционал
R>
R>    inline System::String ^ ToString( PCWSTR value )
R>    {
R>        return System::Runtime::InteropServices::Marshal::PtrToStringUni((IntPtr)(void*)value);
R>    }

R>


Компилятор прожевал но если использовать эту строку то давится снова.
using namespace System;
using namespace System::Runtime::InteropServices;

#using <System.Core.dll>

const wchar_t* F = L"";

String^ makeStringFromLiteral(const wchar_t* value)
{
    return Marshal::PtrToStringUni(IntPtr(const_cast<void*>(static_cast<const void*>(value))));
}

String^ r()
{
    const wchar_t* text = F;
    String^ str = makeStringFromLiteral(text);
    return str;
}

int main()
{
    String^ x = r();
    //if(x->Length == 0) {}
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 18.10.16 20:07
Оценка:
Здравствуйте, _NN_, Вы писали:

Есть конечно вариант заменить String::Length на System::Linq::Enumerable::Count
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 18.10.16 20:20
Оценка:
Здравствуйте, rm822, Вы писали:

Кстати можно еще больше упростить ошибку:

[c]
#using <System.Core.dll>

int main()
{
(System::Runtime::InteropServices::Marshal::PtrToStringUni((IntPtr)(void*)(L"")))->Length;
}
[c]

При этом если сделать другую сборку с простой обёрткой над строкой, то нет проблем.
Нельзя только использовать методы String::String в этой сборке.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 18.10.16 20:40
Оценка:
Здравствуйте, _NN_, Вы писали:

Итак обход проблемы.
Спасибо [C++/CLI] ICE при System.Core за наводку .

Не добавляем в проект ссылку на System.Core.

В файле где нужен System.Core добавляем явно #using <System.Core.dll> и не пользуемся типом 'String' .
В другом файле пользуемся типом 'String' но без плюшек от System.Core.

Профит

Вариант №2: Используем Precompiled Headers и тогда всё работает.


P.S.
VS2010 обрабатывает нормально.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 19.10.2016 13:09 _NN_ . Предыдущая версия .
Re[4]: [C++/CLI] ICE при System.Core
От: rm822 Россия  
Дата: 18.10.16 20:59
Оценка:
_NN>Компилятор прожевал но если использовать эту строку то давится снова.
У меня только 2 идеи,
1 — неймспесы. Потому что аналогичный код у нас всегда был в неймспесе, и вроде бы все работало
2 — ворнинги. Падение на ICE обычно происходило предварительно с выдачей ворнингов, но если они задавлены, то ничего не видно

Вообще поддержка clr в 2008й была кошмарной, нафига ее использовать, когда на дворе 2016
Re[5]: [C++/CLI] ICE при System.Core
От: _NN_ www.nemerleweb.com
Дата: 18.10.16 21:03
Оценка:
Здравствуйте, rm822, Вы писали:

_NN>>Компилятор прожевал но если использовать эту строку то давится снова.

R>У меня только 2 идеи,
R>1 — неймспесы. Потому что аналогичный код у нас всегда был в неймспесе, и вроде бы все работало
Всё в пространстве имён, но как видим разницы нет.

R>2 — ворнинги. Падение на ICE обычно происходило предварительно с выдачей ворнингов, но если они задавлены, то ничего не видно

Уровень 4

R>Вообще поддержка clr в 2008й была кошмарной, нафига ее использовать, когда на дворе 2016

Расскажите как собирать для .NET 3.5 , перейду прямо сейчас.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: [C++/CLI] ICE при System.Core
От: wl. Россия  
Дата: 19.10.16 16:41
Оценка:
Здравствуйте, _NN_, Вы писали:

R>>Вообще поддержка clr в 2008й была кошмарной, нафига ее использовать, когда на дворе 2016

_NN>Расскажите как собирать для .NET 3.5 , перейду прямо сейчас.

это случайно не то? Правда для нового проекта. И реально ли запускается на .net 3.5 проверить не могу

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