[opengtl-commits] [327] do the conversion for binary operations in the AST tree, this ( at last) should solve the issue of pixels-that-need-to-autoconvert-to-vectors and has the extra benefits of generating a compilation error when trying to do a binary operations for value that can 't do it (instead of generating an assert when generating the code...)

[ Thread Index | Date Index | More lists.tuxfamily.org/opengtl-commits Archives ]


Revision: 327
Author:   cyrille
Date:     2008-08-31 00:57:55 +0200 (Sun, 31 Aug 2008)

Log Message:
-----------
do the conversion for binary operations in the AST tree, this (at last) should solve the issue of pixels-that-need-to-autoconvert-to-vectors and has the extra benefits of generating a compilation error when trying to do a binary operations for value that can't do it (instead of generating an assert when generating the code...)

Modified Paths:
--------------
    trunk/OpenGTL/OpenCTL/OpenCTL/Program.cpp
    trunk/OpenGTL/OpenCTL/tests/library/TestParserNG.h
    trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.h
    trunk/OpenGTL/OpenGTL/GTLCore/CodeGenerator_p.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.h
    trunk/OpenGTL/OpenGTL/GTLCore/ConvertCenter_p.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/Debug.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/Function_p.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/ParserBase_p.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/Type.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/Type.h
    trunk/OpenGTL/OpenGTL/GTLCore/Type_p.cpp
    trunk/OpenGTL/OpenGTL/GTLCore/Type_p.h
    trunk/OpenGTL/TODO


Modified: trunk/OpenGTL/OpenCTL/OpenCTL/Program.cpp
===================================================================
--- trunk/OpenGTL/OpenCTL/OpenCTL/Program.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenCTL/OpenCTL/Program.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -297,7 +297,7 @@
         }
       }
       // Some debug
-#ifndef _NDEBUG_
+#ifndef NDEBUG
       for( unsigned int i = 0; i < arguments.size(); i++)
       {
         OCTL_DEBUG("arguments[" << i << "] == " << *arguments[i]);

Modified: trunk/OpenGTL/OpenCTL/tests/library/TestParserNG.h
===================================================================
--- trunk/OpenGTL/OpenCTL/tests/library/TestParserNG.h	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenCTL/tests/library/TestParserNG.h	2008-08-30 22:57:55 UTC (rev 327)
@@ -17,6 +17,7 @@
  * Boston, MA 02110-1301, USA.
  */
 
+#include "OpenCTL/compiler/Compiler.h"
 #include "OpenCTL/compiler/ParserNG.h"
 #include "GTLCore/AST/Tree.h"
 #include "GTLCore/AST/BinaryExpression.h"
@@ -28,7 +29,7 @@
     {
       std::istringstream iss(" const int v = 3 + 4 / 2; \n const int v2 = 3 / 4 + 2;");
       OpenCTL::LexerNG lng(&iss);
-      OpenCTL::ParserNG png( 0, &lng );
+      OpenCTL::ParserNG png( new OpenCTL::Compiler, &lng );
       AST::Tree* tree = png.parse();
       GTL_ASSERT( tree );
       GTLTEST_CHECK_EQUAL( tree->globalConstantDeclarations().size() , 2);

Modified: trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -19,6 +19,9 @@
 
 #include "ConvertExpression.h"
 
+#include "../CodeGenerator_p.h"
+#include "../ExpressionResult_p.h"
+
 using namespace GTLCore;
 using namespace GTLCore::AST;
 
@@ -26,6 +29,11 @@
 {
 }
 
+ConvertExpression::~ConvertExpression()
+{
+  delete m_value;
+}
+
 void ConvertExpression::markAsReturnExpression()
 {
   m_value->markAsReturnExpression();
@@ -35,3 +43,32 @@
 {
   return m_value->isConstant();
 }
+
+const AST::Expression* ConvertExpression::value() const
+{
+  return m_value;
+}
+
+DefaultConvertExpression::DefaultConvertExpression( AST::Expression* _value,  const GTLCore::Type* _dstType ) : ConvertExpression(_value), m_dstType(_dstType)
+{
+}
+
+DefaultConvertExpression::~DefaultConvertExpression()
+{
+}
+
+const GTLCore::Type* DefaultConvertExpression::type() const
+{
+  return m_dstType;
+}
+
+GTLCore::ExpressionResult DefaultConvertExpression::generateValue( GenerationContext& _gc, llvm::BasicBlock* bb ) const
+{
+  GTLCore::ExpressionResult result = value()->generateValue( _gc, bb );
+  if( result.isConstant() )
+  {
+    return GTLCore::ExpressionResult( CodeGenerator::convertConstantTo( result.constant(), result.type(), m_dstType ), m_dstType);
+  } else {
+    return GTLCore::ExpressionResult( CodeGenerator::convertValueTo( bb,  result.value(), result.type(), m_dstType ), m_dstType);
+  }
+}

Modified: trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.h
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.h	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/AST/ConvertExpression.h	2008-08-30 22:57:55 UTC (rev 327)
@@ -27,11 +27,23 @@
     class ConvertExpression : public Expression {
       public:
         ConvertExpression( AST::Expression* _value );
+        ~ConvertExpression();
         virtual void markAsReturnExpression();
         virtual bool isConstant() const;
+      protected:
+        const AST::Expression* value() const;
       private:
         AST::Expression* m_value;
     };
+    class DefaultConvertExpression : public ConvertExpression {
+      public:
+        DefaultConvertExpression( AST::Expression* _value,  const GTLCore::Type* _dstType );
+        virtual ~DefaultConvertExpression();
+        virtual const GTLCore::Type* type() const;
+        virtual GTLCore::ExpressionResult generateValue( GenerationContext&, llvm::BasicBlock* bb ) const;
+      private:
+        const GTLCore::Type* m_dstType;
+    };
   }
 }
 

Modified: trunk/OpenGTL/OpenGTL/GTLCore/CodeGenerator_p.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/CodeGenerator_p.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/CodeGenerator_p.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -43,32 +43,24 @@
   GTL_ASSERT( _v2_.value() ); \
   const Type* highestPriorityType = Type::Private::selectType( lhsType, rhsType); \
   GTL_ASSERT( highestPriorityType ); \
-  GTLCore::ExpressionResult v1; \
-  GTLCore::ExpressionResult v2; \
-  if(_v1_.isConstant() and _v2_.isConstant()) \
-  { \
-    v1.setConstant(convertConstantTo( _v1_.constant(), lhsType, highestPriorityType)); \
-    v2.setConstant(convertConstantTo( _v2_.constant(), rhsType, highestPriorityType)); \
-  } else { \
-    v1.setValue(convertValueTo( currentBlock, _v1_.value(), lhsType, highestPriorityType)); \
-    v2.setValue(convertValueTo( currentBlock, _v2_.value(), rhsType, highestPriorityType)); \
-  } \
+  GTLCore::ExpressionResult v1 = _v1_; \
+  GTLCore::ExpressionResult v2 = _v2_; \
   GTL_ASSERT( v1.value() ); \
   GTL_ASSERT( v2.value() );
   
 #define UNIFORMIZE_VALUE_TYPES( _v1_, _v2_ ) \
   const Type* highestPriorityType = Type::Private::selectType( lhsType, rhsType); \
   GTL_ASSERT( highestPriorityType ); \
-  llvm::Value* v1 = convertValueTo( currentBlock, _v1_, lhsType, highestPriorityType); \
-  llvm::Value* v2 = convertValueTo( currentBlock, _v2_, rhsType, highestPriorityType); \
+  llvm::Value* v1 = _v1_; \
+  llvm::Value* v2 = _v2_; \
   GTL_ASSERT( v1 ); \
   GTL_ASSERT( v2 );
 
 #define UNIFORMIZE_CONSTANT_TYPES( _v1_, _v2_ ) \
   const Type* highestPriorityType = Type::Private::selectType( lhsType, rhsType); \
   GTL_ASSERT( highestPriorityType ); \
-  llvm::Constant* v1 = convertConstantTo( _v1_, lhsType, highestPriorityType); \
-  llvm::Constant* v2 = convertConstantTo( _v2_, rhsType, highestPriorityType); \
+  llvm::Constant* v1 = _v1_; \
+  llvm::Constant* v2 = _v2_; \
   GTL_ASSERT( v1 ); \
   GTL_ASSERT( v2 );
 
@@ -643,7 +635,7 @@
     
   }
   
-#ifndef _NDEBUG_
+#ifndef NDEBUG
   {
     const llvm::FunctionType *FTy =
       llvm::cast<llvm::FunctionType>(llvm::cast<llvm::PointerType>(llvmFunction->getType())->getElementType());

Modified: trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -21,6 +21,7 @@
 
 #include <map>
 
+#include "ConvertCenter_p.h"
 #include "Debug.h"
 #include "ErrorMessage.h"
 #include "ScopedName.h"
@@ -32,14 +33,16 @@
   GTLCore::String moduleName;
   std::list<ErrorMessage> errorMessages;
   std::map< GTLCore::ScopedName, GTLCore::Function* > functions;
+  ConvertCenter* convertCenter;
 };
 
 CompilerBase::CompilerBase() : d(new Private)
 {
-  
+  d->convertCenter = new ConvertCenter;
 }
 CompilerBase::~CompilerBase()
 {
+  delete d->convertCenter;
   delete d;
 }
 
@@ -109,3 +112,8 @@
   }
 }
 
+ConvertCenter* CompilerBase::convertCenter()
+{
+  return d->convertCenter;
+}
+

Modified: trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.h
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.h	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/CompilerBase_p.h	2008-08-30 22:57:55 UTC (rev 327)
@@ -24,6 +24,7 @@
 #include <GTLCore/String.h>
 
 namespace GTLCore {
+  class ConvertCenter;
   class ErrorMessage;
   class Function;
   class ScopedName;
@@ -49,6 +50,10 @@
        * @return the type manager used for compilation
        */
       virtual GTLCore::TypeManager* typeManager() = 0;
+      /**
+       * @return the \ref ConvertCenter used for compilation
+       */
+      ConvertCenter* convertCenter();
     public:
       virtual GTLCore::AST::Expression* standardConstant( const GTLCore::String& _name ) = 0;
     protected:

Modified: trunk/OpenGTL/OpenGTL/GTLCore/ConvertCenter_p.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/ConvertCenter_p.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/ConvertCenter_p.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -23,6 +23,7 @@
 #include <map>
 
 #include "AST/ConvertExpression.h"
+#include "Debug.h"
 #include "Type_p.h"
 
 using namespace GTLCore;
@@ -48,9 +49,14 @@
   public:
     virtual AST::ConvertExpression* create( AST::Expression* value, const GTLCore::Type* _dstType ) const
     {
-      return 0;
+      return new AST::DefaultConvertExpression( value, _dstType );
     }
-    virtual bool canConvertBetween( const GTLCore::Type* srcType, const GTLCore::Type* dstType) const = 0;
+    virtual bool canConvertBetween( const GTLCore::Type* srcType, const GTLCore::Type* dstType) const
+    {
+      return ( srcType == dstType)
+          or ( dstType->dataType() == Type::VECTOR and canConvertBetween( srcType, dstType->embeddedType() ) )
+          or ( srcType->isNumber() and dstType->isNumber() );
+    }
 };
 
 //--------------------------------- ConvertCenter --------------------------------//
@@ -62,6 +68,7 @@
 
 ConvertCenter::ConvertCenter() : d(new Private)
 {
+  addConvertExpressionFactory( new DefaultConvertExpressionFactory );
 }
 
 ConvertCenter::~ConvertCenter()
@@ -87,6 +94,8 @@
 
 std::pair<AST::Expression*, AST::Expression*> ConvertCenter::createConvertExpressions( AST::Expression* value1, AST::Expression* value2 ) const
 {
+  GTL_ASSERT(value1);
+  GTL_ASSERT(value2);
   // Auto conversion
   value1 = createConvertExpression( value1, autoConvertType( value1->type() ) );
   value2 = createConvertExpression( value2, autoConvertType( value2->type() ) );

Modified: trunk/OpenGTL/OpenGTL/GTLCore/Debug.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/Debug.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/Debug.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -37,8 +37,6 @@
 
 using namespace GTLCore;
 
-#ifndef _NDEBUG_
-
 struct FunctionDebugInfo {
   FunctionDebugInfo() : enabled( true ) {}
   bool enabled;
@@ -221,8 +219,6 @@
   if( s_instance == 0) s_instance = new Debug::Private;
   return s_instance;
 }
-  
-#endif
 
 namespace GTLCore {
   std::ostream& operator<< (std::ostream& _ostr, const ExpressionResult& _expressionResult)

Modified: trunk/OpenGTL/OpenGTL/GTLCore/Function_p.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/Function_p.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/Function_p.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -44,7 +44,7 @@
 {
   m_functions = _functions;
   GTL_ASSERT(m_functions.size() == m_maximumParameters + 1);
-#ifndef _NDEBUG_
+#ifndef NDEBUG
   for(unsigned int i = 0; i < m_minimumParameters; ++i)
   {
     GTL_ASSERT( m_functions[i] == 0);

Modified: trunk/OpenGTL/OpenGTL/GTLCore/ParserBase_p.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/ParserBase_p.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/ParserBase_p.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -40,6 +40,7 @@
 #include "AST/Tree.h"
 #include "AST/UnaryExpression.h"
 #include "CompilerBase_p.h"
+#include "ConvertCenter_p.h"
 #include "LexerBase_p.h"
 #include "Debug.h"
 #include "Token_p.h"
@@ -1219,63 +1220,91 @@
 
 AST::Expression* ParserBase::createBinaryOperator( const Token& token, AST::Expression* lhs, AST::Expression* rhs )
 {
-  switch( token.type )
+  if( not lhs or not rhs )
   {
-    case Token::EQUAL:
+    delete lhs;
+    delete rhs;
+    return 0;
+  }
+  if( token.type == Token::EQUAL )
+  {
+    AST::AccessorExpression* ve = dynamic_cast<AST::AccessorExpression*>( lhs );
+    if( ve )
     {
-      AST::AccessorExpression* ve = dynamic_cast<AST::AccessorExpression*>( lhs );
-      if( ve )
+      return new AST::AssignementBinaryExpression( ve, rhs );
+    }
+    reportError("Left hand side of an assignement expression must be a variable.", token);
+    return 0;
+    
+  } else {
+    std::pair<AST::Expression*, AST::Expression*>  ce = d->compiler->convertCenter()->createConvertExpressions( lhs, rhs );
+    if( not ce.first or not ce.second )
+    {
+      reportError( "Can do a binary operation only on two numbers", token );
+      if(ce.first)
       {
-        return new AST::AssignementBinaryExpression( ve, rhs );
+        delete ce.first;
+      } else {
+        delete lhs;
       }
-      reportError("Left hand side of an assignement expression must be a variable.", token);
+      if(ce.second)
+      {
+        delete ce.second;
+      } else {
+        delete rhs;
+      }
       return 0;
     }
-    case Token::OR:
-      return new AST::OrBinaryExpression( lhs, rhs );
-    case Token::AND:
-      return new AST::AndBinaryExpression( lhs, rhs );
-    case Token::BITOR:
-      return new AST::BitOrBinaryExpression( lhs, rhs );
-    case Token::BITXOR:
-      return new AST::BitXorBinaryExpression( lhs, rhs );
-    case Token::BITAND:
-      return new AST::BitAndBinaryExpression( lhs, rhs );
-    case Token::EQUALEQUAL:
-      return new AST::EqualEqualBinaryExpression( lhs, rhs );
-    case Token::DIFFERENT:
-      return new AST::DifferentBinaryExpression( lhs, rhs );
-    case Token::INFERIOREQUAL:
-      return new AST::InferiorEqualBinaryExpression( lhs, rhs );
-    case Token::INFERIOR:
-      return new AST::InferiorBinaryExpression( lhs, rhs );
-    case Token::SUPPERIOREQUAL:
-      return new AST::SupperiorEqualBinaryExpression( lhs, rhs );
-    case Token::SUPPERIOR:
-      return new AST::SupperiorBinaryExpression( lhs, rhs );
-    case Token::RIGHTSHIFT:
-      return new AST::RightShiftBinaryExpression( lhs, rhs );
-    case Token::LEFTSHIFT:
-      return new AST::LeftShiftBinaryExpression( lhs, rhs );
-    case Token::PLUS:
-      return new AST::AdditionBinaryExpression( lhs, rhs );
-    case Token::MINUS:
-      return new AST::SubstractionBinaryExpression( lhs, rhs );
-    case Token::MULTIPLY:
-      return new AST::MultiplicationBinaryExpression( lhs, rhs );
-    case Token::DIVIDE:
-      return new AST::DivisionBinaryExpression( lhs, rhs );
-    case Token::MODULO:
+    lhs = ce.first;
+    rhs = ce.second;
+    switch( token.type )
     {
-      if( lhs->type() != rhs->type() and rhs->type()  != Type::Integer32 )
+      case Token::OR:
+        return new AST::OrBinaryExpression( lhs, rhs );
+      case Token::AND:
+        return new AST::AndBinaryExpression( lhs, rhs );
+      case Token::BITOR:
+        return new AST::BitOrBinaryExpression( lhs, rhs );
+      case Token::BITXOR:
+        return new AST::BitXorBinaryExpression( lhs, rhs );
+      case Token::BITAND:
+        return new AST::BitAndBinaryExpression( lhs, rhs );
+      case Token::EQUALEQUAL:
+        return new AST::EqualEqualBinaryExpression( lhs, rhs );
+      case Token::DIFFERENT:
+        return new AST::DifferentBinaryExpression( lhs, rhs );
+      case Token::INFERIOREQUAL:
+        return new AST::InferiorEqualBinaryExpression( lhs, rhs );
+      case Token::INFERIOR:
+        return new AST::InferiorBinaryExpression( lhs, rhs );
+      case Token::SUPPERIOREQUAL:
+        return new AST::SupperiorEqualBinaryExpression( lhs, rhs );
+      case Token::SUPPERIOR:
+        return new AST::SupperiorBinaryExpression( lhs, rhs );
+      case Token::RIGHTSHIFT:
+        return new AST::RightShiftBinaryExpression( lhs, rhs );
+      case Token::LEFTSHIFT:
+        return new AST::LeftShiftBinaryExpression( lhs, rhs );
+      case Token::PLUS:
+        return new AST::AdditionBinaryExpression( lhs, rhs );
+      case Token::MINUS:
+        return new AST::SubstractionBinaryExpression( lhs, rhs );
+      case Token::MULTIPLY:
+        return new AST::MultiplicationBinaryExpression( lhs, rhs );
+      case Token::DIVIDE:
+        return new AST::DivisionBinaryExpression( lhs, rhs );
+      case Token::MODULO:
       {
-        reportError( "'~' operator only work with integer" , token );
+        if( lhs->type() != rhs->type() and rhs->type()  != Type::Integer32 )
+        {
+          reportError( "'~' operator only work with integer" , token );
+          return 0;
+        }
+        return new AST::ModuloBinaryExpression( lhs, rhs );
+      }
+      default:
         return 0;
-      }
-      return new AST::ModuloBinaryExpression( lhs, rhs );
     }
-    default:
-      return 0;
   }
 }
 

Modified: trunk/OpenGTL/OpenGTL/GTLCore/Type.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/Type.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/Type.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -252,3 +252,8 @@
   GTL_ASSERT( dataType() == Type::VECTOR );
   return d->vectorSize;
 }
+
+bool Type::isNumber() const
+{
+  return d->dataType == BOOLEAN or d->dataType == INTEGER8 or d->dataType == UNSIGNED_INTEGER8 or d->dataType == INTEGER16 or d->dataType == UNSIGNED_INTEGER16 or d->dataType == INTEGER32 or d->dataType == UNSIGNED_INTEGER32 or d->dataType == DOUBLE or d->dataType == FLOAT or d->dataType == HALF;
+}

Modified: trunk/OpenGTL/OpenGTL/GTLCore/Type.h
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/Type.h	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/Type.h	2008-08-30 22:57:55 UTC (rev 327)
@@ -193,7 +193,10 @@
        * @return the size of a vector
        */
       int vectorSize() const;
-      
+      /**
+       * @return true if the type is a number (this return false if the type is a \ref VECTOR )
+       */
+      bool isNumber() const;
     private:
       struct Private;
       Private* const d;

Modified: trunk/OpenGTL/OpenGTL/GTLCore/Type_p.cpp
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/Type_p.cpp	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/Type_p.cpp	2008-08-30 22:57:55 UTC (rev 327)
@@ -279,3 +279,4 @@
   GTL_DEBUG("Select type failed : "<< *type1 << " " << *type2 );
   return 0;
 }
+

Modified: trunk/OpenGTL/OpenGTL/GTLCore/Type_p.h
===================================================================
--- trunk/OpenGTL/OpenGTL/GTLCore/Type_p.h	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/OpenGTL/GTLCore/Type_p.h	2008-08-30 22:57:55 UTC (rev 327)
@@ -128,6 +128,7 @@
        * @return true if this a "nested" array (ie int a[2][3]; is nested, while int a[2]; isn't)
        */
       bool isNestedArray();
+      
     private:
       void setType( const llvm::Type* _type);
       const llvm::Type* m_type;

Modified: trunk/OpenGTL/TODO
===================================================================
--- trunk/OpenGTL/TODO	2008-08-30 21:21:36 UTC (rev 326)
+++ trunk/OpenGTL/TODO	2008-08-30 22:57:55 UTC (rev 327)
@@ -1,6 +1,7 @@
 Blocker for 1.0:
  * array overflow
  * array/structure leak in return function (when assigne to a member or an index of an array) (<= might be fixed)
+ * remove all DEPRECATED functions
 
 Important TODO
  * access to vector using specific vector instructions


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/