From ccb64b8b63a4f28f7555daa971e3ee6bc92f84dc Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sun, 8 Jan 2017 14:23:44 -0500 Subject: [PATCH] Bug 510010 - Uniform initialization in template argument Change-Id: I55853735e44fdf6240bebb53f2e7ab1a6885b273 --- .../parser/tests/ast2/AST2TemplateTests.java | 22 ++++++++++++++++ .../dom/parser/cpp/GNUCPPSourceParser.java | 25 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 207acf84227..07a97332041 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -7806,6 +7806,28 @@ public class AST2TemplateTests extends AST2TestBase { public void testConstexprFunctionCallInTemplateArgument_332829() throws Exception { parseAndCheckBindings(); } + + // struct IntConvertible { + // constexpr operator int() const { return 42; } + // }; + // + // template + // struct Waldo {}; + // + // Waldo w; // Syntax error + public void testUniformInitializationInTemplateArgument_510010() throws Exception { + parseAndCheckBindings(); + } + + // int f() { + // int i = 0; + // if(i < 1){ + // ++i; + // } + // } + public void testRegression_510010() throws Exception { + parseAndCheckBindings(); + } // template // struct C {}; 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 663583a7598..485d46b8f1e 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 @@ -572,9 +572,32 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } } break; - case IToken.tSEMI: + + // In C++11, braces can occur at the top level in a template-argument, + // if an object of class type is being created via uniform initialization, + // and that class type has a constexpr conversion operator to a type + // that's valid as the type of a non-type template parameter. case IToken.tLBRACE: + if (nk == 0) { + nk = IToken.tLBRACE; + depth = 0; + } else if (nk == IToken.tLBRACE) { + depth++; + } + break; + case IToken.tRBRACE: + if (nk == 0) { + return NO_TEMPLATE_ID; + } + else if (nk == IToken.tLBRACE) { + if (--depth < 0) { + nk = 0; + } + } + break; + + case IToken.tSEMI: if (nk == 0) { return NO_TEMPLATE_ID; }