--- a/cmajor++/Cm/Cm.Core/Error.hpp
+++ b/cmajor++/Cm/Cm.Core/Error.hpp
@@ -25,7 +25,8 @@
 const int C0 = 400;
 const int A0 = 600;
 const int L0 = 800;
-const int I0 = 1000;
+const int G0 = 1000;
+const int I0 = 1200;
 
 std::string Category(int code);
 
@@ -78,10 +79,19 @@
     AssemblyException(const std::string& toolName_, const std::string& filePath_, int line_, int column_, const std::string& message_);
 };
 
-class LinkException: public ToolError
-{
-public:
-    LinkException(const std::string& toolName_, const std::string& filePath_, int line_, int column_, const std::string& message_);
+class LinkException: public std::runtime_error
+{
+public:
+    LinkException(const std::string& message_);
+};
+
+class GCCException: public std::runtime_error
+{
+public:
+    GCCException(const std::string& exePath_, const std::string& message_);
+    const std::string& ExePath() const { return exePath; }
+private:
+    std::string exePath;
 };
 
 int RegisterParsedFileName(const std::string& parsedFileName);
@@ -265,6 +275,7 @@
 const int INVALID_MEMBERFUNCTION_INDEX = 169;
 const int CLASSTEMPLATE_NOT_FOUND = 170;
 const int TEMPLATE_ARGUMENT_MISMATCH = 171;
+const int DESTRUCTOR_CANNOT_BE_ABSTRACT = 172;
 
 // Code generation errors:
 const int PROGRAM_DOES_NOT_CONTAIN_MAIN = 1;
@@ -281,6 +292,9 @@
 // Link errors:
 const int LINK_ERROR = 1;
 
+// GCC errors:
+const int GCC_ERROR = 1;
+
 // Internal errors:
 const int ASSERTION_FAILED = 1;
 const int STD_EXCEPTION = 2;