Clang nem forditja le a static_assert-et

 ( moravas | 2013. február 1., péntek - 18:32 )

Sziasztok,

van egy C++ project, amit clang-gal szeretnéd fordítani a c++11 szabvány szerint, de sajnos vmit ne mkezel rendesen. Ugyanezt a kódot viszont g++-szal le tudom fordítani. A sor, amire a hibát dobja, ez:

static_assert((std::numeric_limits::max() != std::numeric_limits::max()),
"Don't suppoerted computation type");

A hibaüzenet:

iblock.h:36: error: static_assert expression is not an integral constant expression
iblockwrapper.h:8: in instantiation of template class 'IController<1, double, long double, true>' requested here

Valaki találkozott már ilyennel?

Üdv: moravas

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Gondolom az lehet a baja, hogy constant expressiont vár, a max() függvény pedig függvény, tehát nem constant expression. Amit nem értek, mert constexpr-el van megadva. A limits fájlod mit mond?
----
India delenda est.
Hülye pelikán

Hello,

a limits file alatt a beincludált limits.h-t értenéd?

Üdv: moravas

Először is, a kódrészletet nem sikerült a topikindítóba jól benyomni; a kisebb-nagyobb jelek közötti template paramétereket (amelyekkel a numeric_limits-t specializáljuk) escape-elés híján a blogmotor elnyelte.

Másrészt, C++11 szabványom nincs; a C++03 ezt mondja a 18.2.1 Numeric limits-ben:

[p2] Specializations shall be provided for each fundamental type, both floating point and integer, including bool. [...]

Eddig OK, tételezzük fel, hogy az elnyelt template paraméterek valóban fundamental type-ok voltak.

[p3] For all members declared static const in the numeric_limits template, specializations shall define these values in such a way that they are usable as integral constant expressions.

A 18.2.1.1 Class template numeric_limits szerint azonban a min() és max() egyike sem const.

A hiba tehát a forráskódban van, amely ezeket static_assert()-ben próbálja használni. g++-szal történetesen lefordul, de a szabvány nem követeli meg az implementációtól, hogy a max() ilyen környezetben használható legyen, ezért a clang jogosan rinyál.

Használni lehet esetleg makrókat a <climits> ill. <cfloat> header-ökből.

A C++11 szerint ezek constexpr függvények, ami azt eredményezi, hogy ha fordítási időben ki tudja számolni, akkor fordítási idejű konstansnak számít. Tehát használható ott, max a clang még nem tud róla.
----
India delenda est.
Hülye pelikán

Elolvastam a header file-t, amit használ, és a min illetve a max is constexpr-ként van definiálva, viszont a felettünk szóló kolléga bejegyzése alapján megnéztem, és ha jól sikerült tájékozódni, a clang ezt a feature-t egész egyszerűen még nem támogatja. Ezért nem tudja kiszámolni a kifejezést, amit beirtam neki.

ŰÜdv: moravas

Ird le rendesen a kodot. Igy nem lehet erteni, hogy mit akartal eredetileg.

pastebin?