Andrei Alexandrescu wrote:

I'm not sure where the discussion leaves us, but at the end of the day we're in the following situation:

1. I just svn up'ed a minute ago and built dmd. It shows version 2.048.

2. This program:

unittest
{
    int x = printf("inside unittest\n");
    assert(x == 100000);
}

void main(string args[])
{
    writeln("inside main");
}

prints this:

inside unittest
test(7): unittest failure
inside main

and exits with error code zero.

Please advise.


I just tried it (on Windows and Ubuntu) and it does not print "inside main". Also, it needs an "import std.stdio;"

I suggest verifying that druntime/src/core/runtime.d contains the following code:

extern (C) __gshared unittest_errors = false;

extern (C) bool runModuleUnitTests()
{
   static if( __traits( compiles, backtrace ) )
   {
static extern (C) void unittestSegvHandler( int signum, siginfo_t* info, void* ptr )
       {
           static enum MAXFRAMES = 128;
           void*[MAXFRAMES]  callstack;
           int               numframes;

           numframes = backtrace( callstack, MAXFRAMES );
           backtrace_symbols_fd( callstack, numframes, 2 );
       }

       sigaction_t action = void;
       sigaction_t oldseg = void;
       sigaction_t oldbus = void;

       (cast(byte*) &action)[0 .. action.sizeof] = 0;
       sigfillset( &action.sa_mask ); // block other signals
       action.sa_flags = SA_SIGINFO | SA_RESETHAND;
       action.sa_sigaction = &unittestSegvHandler;
       sigaction( SIGSEGV, &action, &oldseg );
       sigaction( SIGBUS, &action, &oldbus );
       scope( exit )
       {
           sigaction( SIGSEGV, &oldseg, null );
           sigaction( SIGBUS, &oldbus, null );
       }
   }

   if( Runtime.sm_moduleUnitTester is null )
   {
       foreach( m; ModuleInfo )
       {
           if( m )
           {
               auto fp = m.unitTest;

               if( fp )
                   fp();
           }
       }
       return !unittest_errors;
   }
   return Runtime.sm_moduleUnitTester();
}

and druntime/src/core/exception.d contains the following code:

extern (C) extern __gshared bool unittest_errors;

extern (C) void onUnittestErrorMsg( string file, size_t line, string msg )
{
   static char[] intToString( char[] buf, uint val )
   {
       assert( buf.length > 9 );
       auto p = buf.ptr + buf.length;

       do
       {
           *--p = cast(char)(val % 10 + '0');
       } while( val /= 10 );

       return buf[p - buf.ptr .. $];
   }

   static struct Console
   {
       Console opCall( in char[] val )
       {
           version( Windows )
           {
               uint count = void;
WriteFile( GetStdHandle( 0xfffffff5 ), val.ptr, val.length, &count, null );
           }
           else version( Posix )
           {
               write( 2, val.ptr, val.length );
           }
           return this;
       }


       Console opCall( uint val )
       {
           char[10] tmp = void;
           return opCall( intToString( tmp, val ) );
       }
   }

   static __gshared Console console;

   unittest_errors = true;
   console( file )( "(" )( line )( "): " )( msg )( "\n" );
}

If they do, then make sure you really did delete the druntime lib and rebuild it and you're not linking with an old one.

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to