[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/sdk/kdevelop/languages/cpp/parser
From:       Olivier Jean de Gaalon <olivier.jg () gmail ! com>
Date:       2009-12-16 9:24:20
Message-ID: 1260955460.332335.24838.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1062837 by olivierjg:

Allow primary and conditional expressions as template arguments, add tests.
BUG: 183092


 M  +10 -4     parser.cpp  
 M  +13 -0     tests/test_parser.cpp  


--- trunk/extragear/sdk/kdevelop/languages/cpp/parser/parser.cpp #1062836:1062837
@@ -1325,14 +1325,20 @@
   TypeIdAST *typeId = 0;
   ExpressionAST *expr = 0;
 
-  if (!parseTypeId(typeId) || (session->token_stream->lookAhead() != ','
-                               && session->token_stream->lookAhead() != '>' && \
session->token_stream->lookAhead() != ')')) +  if (!parseTypeId(typeId) ||
+       (session->token_stream->lookAhead() != ',' && \
session->token_stream->lookAhead() != '>' && session->token_stream->lookAhead() != \
')')) +  {
+    rewind(start);
+
+    if (!parsePrimaryExpression(expr) ||
+         (session->token_stream->lookAhead() != ',' && \
session->token_stream->lookAhead() != '>' && session->token_stream->lookAhead() != \
')'))  {
       rewind(start);
-
-      if (!parseLogicalOrExpression(expr, true))
+      
+      if (!parseConditionalExpression(expr))
         return false;
     }
+  }
 
   TemplateArgumentAST *ast = CreateNode<TemplateArgumentAST>(session->mempool);
   ast->type_id = typeId;
--- trunk/extragear/sdk/kdevelop/languages/cpp/parser/tests/test_parser.cpp \
#1062836:1062837 @@ -111,6 +111,19 @@
     QVERIFY(ast->declarations != 0);
   }
   
+  void testTemplateArguments()
+  {
+    QByteArray templatetest("template <int N, int M> struct SeriesAdder{ enum { \
value = N + SeriesAdder< 0 >::value }; };"); +    pool mem_pool;
+    TranslationUnitAST* ast = parse(templatetest, &mem_pool);
+    QVERIFY(ast != 0);
+    QVERIFY(ast->declarations != 0);
+    for (int i = 0; i < control.problems().count(); i++)
+    {
+      QVERIFY(control.problems().at(i)->description() == "Unexpected end of file");
+    }
+  }
+  
   void testManyComparisons()
   {
     //Should not crash


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic