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 <int>
+	//	struct Waldo {};
+	//
+	//	Waldo<IntConvertible{}> 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<bool, typename T = void>
 	//	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;
 					}