diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java index d74169f8164..b96f0b4a302 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecFailingTest.java @@ -175,31 +175,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } } - /** - [--Start Example(CPP 8.2-4): - template - struct S { - T *p; - }; - S x; // typeid - S y; // expression (illformed) - --End Example] - */ - public void test8_2s4() { // TODO raised bug 90632 - StringBuffer buffer = new StringBuffer(); - buffer.append("template \n"); //$NON-NLS-1$ - buffer.append("struct S {\n"); //$NON-NLS-1$ - buffer.append("T *p;\n"); //$NON-NLS-1$ - buffer.append("};\n"); //$NON-NLS-1$ - buffer.append("S x; // typeid\n"); //$NON-NLS-1$ - buffer.append("S y; // expression (illformed)\n"); //$NON-NLS-1$ - try { - parse(buffer.toString(), ParserLanguage.CPP, true, 0); - assertTrue(false); - } catch (Exception e) { - } - } - /** [--Start Example(CPP 8.2-7a): class C { }; @@ -559,25 +534,6 @@ public class AST2CPPSpecFailingTest extends AST2SpecBaseTest { } catch (Exception e) { } } - - /** - [--Start Example(CPP 14.5.5.1-8b): - // Illformed, no diagnostic required - template void f(A, A); - template void f(A, A); - --End Example] - */ - public void test14_5_5_1s8b() { - StringBuffer buffer = new StringBuffer(); - buffer.append("// Illformed, no diagnostic required\n"); //$NON-NLS-1$ - buffer.append("template void f(A, A);\n"); //$NON-NLS-1$ - buffer.append("template void f(A, A);\n"); //$NON-NLS-1$ - try { - parse(buffer.toString(), ParserLanguage.CPP, false, 0); - assertTrue(false); - } catch (Exception e) { - } - } /** [--Start Example(CPP 14.8.1-4): diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java index c13bab3ff18..0c7ed94ad6e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java @@ -3362,6 +3362,29 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(buffer.toString(), ParserLanguage.CPP, true, 0); } + /** + [--Start Example(CPP 8.2-4): + template + struct S { + T *p; + }; + S x; // typeid + S y; // expression (illformed) + --End Example] + */ + public void test8_2s4() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template \n"); //$NON-NLS-1$ + buffer.append("struct S {\n"); //$NON-NLS-1$ + buffer.append("T *p;\n"); //$NON-NLS-1$ + buffer.append("};\n"); //$NON-NLS-1$ + buffer.append("S x; // typeid\n"); //$NON-NLS-1$ + buffer.append("S y; // expression (illformed)\n"); //$NON-NLS-1$ + + //test is only for syntax, semantics are not checked here. + parse(buffer.toString(), ParserLanguage.CPP, true, 0); + } + /** [--Start Example(CPP 8.2-5): void foo() @@ -9450,6 +9473,24 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(buffer.toString(), ParserLanguage.CPP, true, 0); } + + /** + [--Start Example(CPP 14.5.5.1-8b): + // Illformed, no diagnostic required + template void f(A, A); + template void f(A, A); + --End Example] + */ + public void test14_5_5_1s8b() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("// Illformed, no diagnostic required\n"); //$NON-NLS-1$ + buffer.append("template void f(A, A);\n"); //$NON-NLS-1$ + buffer.append("template void f(A, A);\n"); //$NON-NLS-1$ + + //test is only for syntax, semantics are not checked here. + parse(buffer.toString(), ParserLanguage.CPP, false, 0); + } + /** [--Start Example(CPP 14.5.5.2-5): template struct A { A(); }; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 24de2745421..424c70175a9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -303,13 +303,17 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken mark = mark(); - IASTTypeId typeId = typeId(false); - if (typeId != null) { - list.add(typeId); - completedArg = true; - } else { - backup(mark); - } + IASTTypeId typeId = typeId(false); + if (typeId == null) { + backup(mark); + } else if (LT(1) != IToken.tCOMMA && LT(1) != IToken.tGT && LT(1) != IToken.tEOC){ + //didn't consume the whole argument, probably confused typeId with idExpression + //backup and try the assignmentExpression + backup(mark); + } else { + list.add(typeId); + completedArg = true; + } if (!completedArg) { try { IASTExpression expression = assignmentExpression();