Builds almost completely cleanly with -WEverything in LLVM
diff --git a/include/internal/catch_commandline.hpp b/include/internal/catch_commandline.hpp
index d25e33e..d1b39a8 100644
--- a/include/internal/catch_commandline.hpp
+++ b/include/internal/catch_commandline.hpp
@@ -9,7 +9,6 @@
 #define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
 
 #include "catch_config.hpp"
-#include "catch_runner_impl.hpp"
 
 namespace Catch {
 
@@ -42,7 +41,8 @@
         std::string name() const { return m_name; }
         std::string operator[]( std::size_t i ) const { return m_args[i]; }
         std::size_t argsCount() const { return m_args.size(); }
-        
+
+        CATCH_ATTRIBUTE_NORETURN
         void raiseError( const std::string& message ) const {
             std::ostringstream oss;
             oss << "Error while parsing " << m_name << ". " << message << ".";
diff --git a/include/internal/catch_common.h b/include/internal/catch_common.h
index 624966d..ee4a565 100644
--- a/include/internal/catch_common.h
+++ b/include/internal/catch_common.h
@@ -16,9 +16,9 @@
 #define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
 
 #ifdef __GNUC__
-#define ATTRIBUTE_NORETURN __attribute__ ((noreturn))
+#define CATCH_ATTRIBUTE_NORETURN __attribute__ ((noreturn))
 #else
-#define ATTRIBUTE_NORETURN
+#define CATCH_ATTRIBUTE_NORETURN
 #endif
 
 #include <sstream>
@@ -32,7 +32,7 @@
 		void operator = ( const NonCopyable& );
 	protected:
 		NonCopyable() {}
-		virtual ~NonCopyable() {}
+		virtual ~NonCopyable();
 	};
     
     class SafeBool {
@@ -110,21 +110,16 @@
         return os;
     }
     
-    ATTRIBUTE_NORETURN
-    inline void throwLogicError( const std::string& message, const std::string& file, std::size_t line ) {
+    CATCH_ATTRIBUTE_NORETURN
+    inline void throwLogicError( const std::string& message, const SourceLineInfo& locationInfo ) {
         std::ostringstream oss;
-        oss << "Internal Catch error: '" << message << "' at: " << SourceLineInfo( file, line );
+        oss << "Internal Catch error: '" << message << "' at: " << locationInfo;
         throw std::logic_error( oss.str() );
     }
 }
 
-#define CATCH_INTERNAL_ERROR( msg ) throwLogicError( msg, __FILE__, __LINE__ );
-
-//#ifdef __FUNCTION__
-//#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FUNCTION__, __FILE__, __LINE__ )
-//#else
-#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, __LINE__ )
-//#endif
+#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
+#define CATCH_INTERNAL_ERROR( msg ) ::Catch::throwLogicError( msg, CATCH_INTERNAL_LINEINFO );
 
 #endif // TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
 
diff --git a/include/internal/catch_config.hpp b/include/internal/catch_config.hpp
index 7f8e2a2..fa48809 100644
--- a/include/internal/catch_config.hpp
+++ b/include/internal/catch_config.hpp
@@ -64,8 +64,9 @@
     private:
         Config( const Config& other );
         Config& operator = ( const Config& other );
+        virtual void dummy();
     public:
-                
+
         Config()
         :   m_streambuf( NULL ),
             m_os( std::cout.rdbuf() )
@@ -77,7 +78,7 @@
             m_os( std::cout.rdbuf() )
         {}
         
-        ~Config() {
+        virtual ~Config() {
             m_os.rdbuf( std::cout.rdbuf() );
             delete m_streambuf;
         }
diff --git a/include/internal/catch_context.h b/include/internal/catch_context.h
index 005b0bf..c3460e3 100644
--- a/include/internal/catch_context.h
+++ b/include/internal/catch_context.h
@@ -23,11 +23,14 @@
     struct IRunner;
     struct IGeneratorsForTest;
 
-    class StreamBufBase : public std::streambuf{};
+    class StreamBufBase : public std::streambuf {
+    public:
+        virtual ~StreamBufBase();
+    };
     
     struct IContext
     {
-        virtual ~IContext(){}
+        virtual ~IContext();
         
         virtual IResultCapture& getResultCapture() = 0;
         virtual IRunner& getRunner() = 0;
@@ -38,6 +41,7 @@
     
     struct IMutableContext : IContext
     {
+        virtual ~IMutableContext();
         virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
         virtual void setRunner( IRunner* runner ) = 0;
         virtual void setConfig( const IConfig* config ) = 0;
diff --git a/include/internal/catch_impl.hpp b/include/internal/catch_impl.hpp
index 5320d8d..6bb11e7 100644
--- a/include/internal/catch_impl.hpp
+++ b/include/internal/catch_impl.hpp
@@ -8,6 +8,11 @@
 
 // Collect all the implementation files together here
 // These are the equivalent of what would usually be cpp files
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wweak-vtables"
+
+#include "catch_runner.hpp"
 #include "catch_registry_hub.hpp"
 #include "catch_notimplemented_exception.hpp"
 #include "catch_context_impl.hpp"
@@ -15,3 +20,35 @@
 #include "catch_generators_impl.hpp"
 #include "catch_resultinfo.hpp"
 #include "catch_resultinfo_builder.hpp"
+
+namespace Catch {
+    NonCopyable::~NonCopyable() {}
+    IShared::~IShared() {}
+    StreamBufBase::~StreamBufBase() {}
+    IContext::~IContext() {}
+    IResultCapture::~IResultCapture() {}
+    ITestCase::~ITestCase() {}
+    ITestCaseRegistry::~ITestCaseRegistry() {}
+    IRegistryHub::~IRegistryHub() {}
+    IMutableRegistryHub::~IMutableRegistryHub() {}
+    IExceptionTranslator::~IExceptionTranslator() {}
+    IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}
+    IReporter::~IReporter() {}
+    IReporterFactory::~IReporterFactory() {}
+    IReporterRegistry::~IReporterRegistry() {}
+    BasicReporter::~BasicReporter() {}
+    IRunner::~IRunner() {}
+    IMutableContext::~IMutableContext() {}
+    IConfig::~IConfig() {}
+    XmlReporter::~XmlReporter() {}
+    JunitReporter::~JunitReporter() {}
+    TestRegistry::~TestRegistry() {}
+    FreeFunctionTestCase::~FreeFunctionTestCase() {}
+    IGeneratorInfo::~IGeneratorInfo() {}
+    IGeneratorsForTest::~IGeneratorsForTest() {}
+
+    void Config::dummy() {}
+
+}
+
+#pragma clang diagnostic pop
diff --git a/include/internal/catch_interfaces_capture.h b/include/internal/catch_interfaces_capture.h
index 4cb74a0..c50d914 100644
--- a/include/internal/catch_interfaces_capture.h
+++ b/include/internal/catch_interfaces_capture.h
@@ -21,7 +21,7 @@
 
     struct IResultCapture {
     
-        virtual ~IResultCapture(){}
+        virtual ~IResultCapture();
         
         virtual void testEnded( const ResultInfo& result ) = 0;
         virtual bool sectionStarted(    const std::string& name, 
diff --git a/include/internal/catch_interfaces_config.h b/include/internal/catch_interfaces_config.h
index ec434e5..01abe56 100644
--- a/include/internal/catch_interfaces_config.h
+++ b/include/internal/catch_interfaces_config.h
@@ -12,7 +12,7 @@
 
     struct IConfig {
     
-        virtual ~IConfig(){}
+        virtual ~IConfig();
         
         virtual bool allowThrows() const = 0;
     };
diff --git a/include/internal/catch_interfaces_exception.h b/include/internal/catch_interfaces_exception.h
index 9054dfe..7614612 100644
--- a/include/internal/catch_interfaces_exception.h
+++ b/include/internal/catch_interfaces_exception.h
@@ -16,12 +16,12 @@
     typedef std::string(*exceptionTranslateFunction)();
 
     struct IExceptionTranslator {
-        virtual ~IExceptionTranslator(){}
+        virtual ~IExceptionTranslator();
         virtual std::string translate() const = 0;
     };
     
     struct IExceptionTranslatorRegistry {
-        virtual ~IExceptionTranslatorRegistry(){}
+        virtual ~IExceptionTranslatorRegistry();
         
         virtual std::string translateActiveException() const = 0;
     };
diff --git a/include/internal/catch_interfaces_generators.h b/include/internal/catch_interfaces_generators.h
index ef651ed..8907adb 100644
--- a/include/internal/catch_interfaces_generators.h
+++ b/include/internal/catch_interfaces_generators.h
@@ -13,13 +13,13 @@
 namespace Catch {
 
     struct IGeneratorInfo {
-        virtual ~IGeneratorInfo(){}
+        virtual ~IGeneratorInfo();
         virtual bool moveNext() = 0;
         virtual std::size_t getCurrentIndex() const = 0;
     };
     
     struct IGeneratorsForTest {
-        virtual ~IGeneratorsForTest() {}
+        virtual ~IGeneratorsForTest();
 
         virtual IGeneratorInfo& getGeneratorInfo( const std::string& fileInfo, std::size_t size ) = 0;
         virtual bool moveNext() = 0;
diff --git a/include/internal/catch_interfaces_registry_hub.h b/include/internal/catch_interfaces_registry_hub.h
index e935340..0da503b 100644
--- a/include/internal/catch_interfaces_registry_hub.h
+++ b/include/internal/catch_interfaces_registry_hub.h
@@ -24,7 +24,7 @@
     struct IExceptionTranslator;
 
     struct IRegistryHub {
-        virtual ~IRegistryHub(){}
+        virtual ~IRegistryHub();
 
         virtual const IReporterRegistry& getReporterRegistry() const = 0;
         virtual const ITestCaseRegistry& getTestCaseRegistry() const = 0;
@@ -32,7 +32,7 @@
     };
 
     struct IMutableRegistryHub {
-        virtual ~IMutableRegistryHub(){}
+        virtual ~IMutableRegistryHub();
         virtual void registerReporter( const std::string& name, IReporterFactory* factory ) = 0;
         virtual void registerTest( const TestCaseInfo& testInfo ) = 0;
         virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
diff --git a/include/internal/catch_interfaces_reporter.h b/include/internal/catch_interfaces_reporter.h
index dddba17..f6b9087 100644
--- a/include/internal/catch_interfaces_reporter.h
+++ b/include/internal/catch_interfaces_reporter.h
@@ -37,7 +37,7 @@
     class ResultInfo;
     
     struct IReporter : IShared {
-        virtual ~IReporter() {}        
+        virtual ~IReporter();
         virtual bool shouldRedirectStdout() const = 0;        
         virtual void StartTesting() = 0;        
         virtual void EndTesting( const Totals& totals ) = 0;        
@@ -52,7 +52,7 @@
     };
     
     struct IReporterFactory {
-        virtual ~IReporterFactory() {}        
+        virtual ~IReporterFactory();
         virtual IReporter* create( const ReporterConfig& config ) const = 0;
         virtual std::string getDescription() const = 0;
     };
@@ -60,7 +60,7 @@
     struct IReporterRegistry {
         typedef std::map<std::string, IReporterFactory*> FactoryMap;
 
-        virtual ~IReporterRegistry() {}
+        virtual ~IReporterRegistry();
         virtual IReporter* create( const std::string& name, const ReporterConfig& config ) const = 0;        
         virtual const FactoryMap& getFactories() const = 0;
     };
diff --git a/include/internal/catch_interfaces_runner.h b/include/internal/catch_interfaces_runner.h
index ee7b348..b932e65 100644
--- a/include/internal/catch_interfaces_runner.h
+++ b/include/internal/catch_interfaces_runner.h
@@ -16,7 +16,7 @@
     class TestCaseInfo;
     
     struct IRunner {
-        virtual ~IRunner() {}        
+        virtual ~IRunner();
         virtual void runAll( bool runHiddenTests = false ) = 0;        
         virtual std::size_t runMatching( const std::string& rawTestSpec ) = 0;        
         virtual Totals getTotals() const = 0;
diff --git a/include/internal/catch_interfaces_testcase.h b/include/internal/catch_interfaces_testcase.h
index f4ba562..f3ccb58 100644
--- a/include/internal/catch_interfaces_testcase.h
+++ b/include/internal/catch_interfaces_testcase.h
@@ -12,7 +12,7 @@
 
 namespace Catch {
     struct ITestCase {
-        virtual ~ITestCase(){}
+        virtual ~ITestCase();
         virtual void invoke () const = 0;        
         virtual ITestCase* clone() const = 0;        
         virtual bool operator == ( const ITestCase& other ) const = 0;        
@@ -22,7 +22,7 @@
     class TestCaseInfo;
 
     struct ITestCaseRegistry {
-        virtual ~ITestCaseRegistry(){}
+        virtual ~ITestCaseRegistry();
         virtual const std::vector<TestCaseInfo>& getAllTests() const = 0;
         virtual std::vector<TestCaseInfo> getMatchingTestCases( const std::string& rawTestSpec ) const = 0;
     };
diff --git a/include/internal/catch_ptr.hpp b/include/internal/catch_ptr.hpp
index 73e53ac..3976b7e 100644
--- a/include/internal/catch_ptr.hpp
+++ b/include/internal/catch_ptr.hpp
@@ -74,7 +74,7 @@
     };
     
     struct IShared : NonCopyable {
-        virtual ~IShared(){}
+        virtual ~IShared();
         virtual void addRef() = 0;
         virtual void release() = 0;
     };
diff --git a/include/internal/catch_reporter_registry.hpp b/include/internal/catch_reporter_registry.hpp
index 485cb3b..21a4896 100644
--- a/include/internal/catch_reporter_registry.hpp
+++ b/include/internal/catch_reporter_registry.hpp
@@ -18,7 +18,7 @@
     
     public:
         
-        ~ReporterRegistry() {
+        virtual ~ReporterRegistry() {
             deleteAllValues( m_factories );
         }
         
diff --git a/include/internal/catch_resultinfo.h b/include/internal/catch_resultinfo.h
index 3ca6276..fb49649 100644
--- a/include/internal/catch_resultinfo.h
+++ b/include/internal/catch_resultinfo.h
@@ -22,7 +22,7 @@
                     const SourceLineInfo& lineInfo,
                     const char* macroName,
                    const char* message );
-        virtual ~ResultInfo();
+        ~ResultInfo();
         
         bool ok() const;
         ResultWas::OfType getResultType() const;
diff --git a/include/internal/catch_runner_impl.hpp b/include/internal/catch_runner_impl.hpp
index 6e4b0c0..15b6074 100644
--- a/include/internal/catch_runner_impl.hpp
+++ b/include/internal/catch_runner_impl.hpp
@@ -70,7 +70,7 @@
             m_reporter->StartTesting();
         }
         
-        ~Runner() {
+        virtual ~Runner() {
             m_reporter->EndTesting( m_totals );
             m_context.setRunner( m_prevRunner );
             m_context.setConfig( NULL );
diff --git a/include/internal/catch_test_case_registry_impl.hpp b/include/internal/catch_test_case_registry_impl.hpp
index 46d2805..5e23fed 100644
--- a/include/internal/catch_test_case_registry_impl.hpp
+++ b/include/internal/catch_test_case_registry_impl.hpp
@@ -19,6 +19,7 @@
     class TestRegistry : public ITestCaseRegistry {
     public:
         TestRegistry() : m_unnamedCount( 0 ) {}
+        virtual ~TestRegistry();
         
         virtual void registerTest( const TestCaseInfo& testInfo ) {
             if( testInfo.getName() == "" ) {
@@ -71,6 +72,7 @@
     public:
 
         FreeFunctionTestCase( TestFunction fun ) : m_fun( fun ) {}
+        virtual ~FreeFunctionTestCase();
         
         virtual void invoke() const {
             m_fun();
diff --git a/include/internal/catch_test_registry.hpp b/include/internal/catch_test_registry.hpp
index f25dedd..5a0ef0d 100644
--- a/include/internal/catch_test_registry.hpp
+++ b/include/internal/catch_test_registry.hpp
@@ -81,7 +81,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 #define INTERNAL_CATCH_TESTCASE_NORETURN( Name, Desc ) \
-    static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() ATTRIBUTE_NORETURN; \
+    static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() CATCH_ATTRIBUTE_NORETURN; \
     namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME(  TestCaseFunction_catch_internal_ ), Name, Desc, CATCH_INTERNAL_LINEINFO ); }\
     static void INTERNAL_CATCH_UNIQUE_NAME(  TestCaseFunction_catch_internal_ )()