Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - [8.49.1 bug] leading :: before namespace
Using dmc 8.49.1 (latest patch over latest release). This small program compiles: ------------ namespace a { typedef int aa; } template<typename T> ::a::aa foo() { return 0; } int main() { return 0; } ------------------ Almost the same program (just returning const) doesn't compile: --------------------------- namespace a { typedef int aa; } template<typename T> const ::a::aa foo() { return 0; } //<<<=== here the leading :: fail int main() { return 0; } ------------------ with error: Digital Mars C/C++ 8.49.1 int ^ x.cpp(13) : Error: malformed template declaration --- errorlevel 1 When the leading :: before namespace is removed the program compiles again: --------------------------- namespace a { typedef int aa; } template<typename T> const a::aa foo() { return 0; } //<<<=== without leading :: it works int main() { return 0; } ------------------ The same problem had happened within much more complex statement and was drilled down to this example. /Pavel PS: I am playing with Boost and it looks that DMC is able to compile practically all the code (with STLport 5.10 and few fixes here and there). Jun 21 2006
What may be also bug is failure to compile template function like: template<...> typename complicated-return-type foo() { ... } DMC doesn't like the word "typename". The test case is in Boost.Multi-Index, a very complicated expression. I'll try to reduce it to something small. /Pavel Jun 21 2006
This short source doesn't compile (8.49.1): --------------------- template<typename T> struct A { typedef int a; }; template<typename T> struct B { typedef A<T> c; typedef c::a a; }; template<typename T> void foo(B<T>::c::a* p) {} // <<<=== here it fails int main() { return 0; } ----------------- The problem is that DMC is not able to recognize that "B<T>::c::a" is valid nested typedef. Replacing it with "B<T>::a" (the same type but defined in B) works. Adding "typename" in front has no effect. This is drilled down problem from Boost.Filesystem. /Pavel Jun 22 2006
Thanks for tracking these down. Jun 22 2006
The code: -------------- #include <stdio.h> struct A { static void foo() { const char* s = __PRETTY_FUNCTION__; // <<<=== here it fails printf("%s\n", s); } }; int main() { A::foo(); return 0; } ------------ fails to compile because of use of __PRETTY_FUNCTION__. When the foo() is standalone or __FUNCTION__ is used everything is OK. It looks that the __PRETTY_FUNCTION__ appends semicolon. The statement: const char* s = (const char*)__PRETTY_FUNCTION__ // no semicolon compiles but produces some garbage. /Pavel Jun 22 2006
This code doesn't compile with 8.49.1. It does with Intel 9.0 and online Comeau. ------------------ // Loki's type select template <bool flag, typename T, typename U> struct Select { typedef T Result; }; template <typename T, typename U> struct Select<false, T, U> { typedef U Result; }; struct A { struct X {}; }; struct B { struct X {}; }; struct C : Select<true, A, B>::Result { static void foo(X) {} //<<<=== here this fails }; int main() { return 0; } ----------------- The issue is with nested type X - it is not properly visible in derived class C and the foo() cannot use it. The example is simplified form of Boost.MPL heavy code within Boost.Multi-Index. /Pavel Jun 22 2006
This snippet doesn't compile: -------------- struct nil_t {}; template <typename T = nil_t> struct X; template <> struct X<nil_t> { X(); template <typename T> X<>& operator=(X<T> const& other) { return *this; } }; inline X<nil_t>::X() {} int main() { return 0; } -------------------- I do not know what is moral story here, but it is a most trimmed down problem that occures in one of Boost.Spirit files. Intel C++ 9.0 and Comean online do compile it. /Pavel Jun 22 2006
I just got info that Boost will use the latest DMC and STLport for regression tests available on http://engineering.meta-comm.com/boost-regression/CVS-RC_1_33_0/user/ Before 8.44b and 4.5.3 were used with results looking rather bad. The change should be visible within 24 hours. /Pavel Jun 23 2006
Pavel Vozenilek wrote:I just got info that Boost will use the latest DMC and STLport for regression tests available on http://engineering.meta-comm.com/boost-regression/CVS-RC_1_33_0/user/ Before 8.44b and 4.5.3 were used with results looking rather bad. The change should be visible within 24 hours. /Pavel Jun 23 2006
"Walter Bright" wrote:I just got info that Boost will use the latest DMC and STLport for regression tests available on http://engineering.meta-comm.com/boost-regression/CVS-RC_1_33_0/user/ Before 8.44b and 4.5.3 were used with results looking rather bad. The change should be visible within 24 hours. Jun 24 2006
From a post in c.l.c++.m: This doesn't compile whether or not the WORKAROUND is defined. ---------------- // different compiler require or do not require the macro //#define WORKAROUND namespace na { class ca; namespace nb { class cb { #ifdef WORKAROUND friend class na::ca; #else friend class ca; #endif cb() {} }; } // nb class ca { nb::cb b; }; } // na int main() { na::ca a; return 0; } --------------------- The example comes from someone's work on Boost port under BCB 2006. Different compilers require or do not require the workaround, DMC fails always. /Pavel Jun 24 2006
|