From 6f89ed8fae17f5791978cf0aafd687621a4e0204 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 5 Feb 2013 16:20:40 -0800 Subject: [PATCH] Bug 396663: Throw expressions within conditional expressions. --- .../core/parser/tests/ast2/AST2CPPTests.java | 37 +++++++++++++++++++ .../dom/parser/cpp/GNUCPPSourceParser.java | 1 - .../parser/cpp/semantics/CPPTemplates.java | 4 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 324d75b26a3..581c67ac809 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -10149,4 +10149,41 @@ public class AST2CPPTests extends AST2TestBase { long BSize = SizeofCalculator.getSizeAndAlignment(B, nameB).size; assertEquals(pointerSize, BSize); } + + // namespace std { + // struct string {}; + // struct exception {}; + // } + // void f(){} + // + // int problemA(int i) { + // return i ? throw 7 : i; + // } + // int problemB(int i) { + // return i ? throw std::string{} : i; + // } + // void ploblemC(int i) { + // return i ? throw std::exception() : throw 3; + // } + // void ploblemD(int i) { + // return i ? throw std::exception() : f(); + // } + // std::string ploblemE(int i) { + // return i ? throw 3 : "a"; + // } + // std::string ploblemF(int i) { + // return (i<2 ? throw 2 : "x") ? (i>2 ? throw 3 : "d") : (i>22 ? throw 4 : "e"); + // } + // auto ploblemG(int i) ->decltype(i ? throw 3 : "d"){ + // return i ? throw 3 : "d" ; + // } + // void fine1(int i) { + // return i ? f() : f(); + // } + // std::string fine2(int i) { + // return i ? "a" : "b"; + // } + public void testThrowExpressionInConditional_396663() throws Exception { + parseAndCheckBindings(getAboveComment(), CPP, true); + } } 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 8975cb53967..00f4124928a 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 @@ -942,7 +942,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { lt1= LT(1); if (lt1 != IToken.tCOLON && lt1 != IToken.tCOMMA) stopWithNextOperator= true; - break; } else if (allowBraceInitializer && LT(1) == IToken.tLBRACE) { // Brace initializer expr= bracedInitList(true); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index d094a8e7952..64a45e67332 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -681,7 +681,9 @@ public class CPPTemplates { IBinding owner = template.getOwner(); ICPPClassSpecialization within = getSpecializationContext(owner); IType instantiatedType = instantiateType(aliasedType, parameterMap, -1, within, id); - return new CPPAliasTemplateInstance(id.toCharArray(), aliasTemplate, instantiatedType); + StringBuilder buf= new StringBuilder(); + buf.append(id.getSimpleID()).append(ASTTypeUtil.getArgumentListString(args, false)); + return new CPPAliasTemplateInstance(buf.toString().toCharArray(), aliasTemplate, instantiatedType); } // Class template.