https://github.com/anondeveg updated https://github.com/llvm/llvm-project/pull/219638
>From 87032f5de44876c8cbb2db019e5d9313fea9d115 Mon Sep 17 00:00:00 2001 From: Anondev <[email protected]> Date: Sat, 29 Aug 2026 08:32:26 +0300 Subject: [PATCH] [clang][Parse] Improve diagnostics for '>>>' closing template parameter lists in CUDA. --- clang/lib/Parse/ParseTemplate.cpp | 11 ++++++++--- clang/test/Parser/cuda-template-angle-brackets.cu | 8 ++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 clang/test/Parser/cuda-template-angle-brackets.cu diff --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp index 735a9bd1f9f1c..8d4dbf9db4a56 100644 --- a/clang/lib/Parse/ParseTemplate.cpp +++ b/clang/lib/Parse/ParseTemplate.cpp @@ -327,8 +327,8 @@ bool Parser::ParseTemplateParameters( // Try to parse the template parameter list. bool Failed = false; - // FIXME: Missing greatergreatergreater support. - if (!Tok.is(tok::greater) && !Tok.is(tok::greatergreater)) { + if (!Tok.is(tok::greater) && !Tok.is(tok::greatergreater) && + !Tok.is(tok::greatergreatergreater)) { TemplateScopes.Enter(Scope::TemplateParamScope); Failed = ParseTemplateParameterList(Depth, TemplateParams); } @@ -342,6 +342,10 @@ bool Parser::ParseTemplateParameters( Tok.setKind(tok::greater); RAngleLoc = Tok.getLocation(); Tok.setLocation(Tok.getLocation().getLocWithOffset(1)); + } else if (Tok.is(tok::greatergreatergreater)) { + Tok.setKind(tok::greatergreater); + RAngleLoc = Tok.getLocation(); + Tok.setLocation(Tok.getLocation().getLocWithOffset(1)); } else if (!TryConsumeToken(tok::greater, RAngleLoc) && Failed) { Diag(Tok.getLocation(), diag::err_expected) << tok::greater; return true; @@ -367,7 +371,8 @@ Parser::ParseTemplateParameterList(const unsigned Depth, // Did we find a comma or the end of the template parameter list? if (Tok.is(tok::comma)) { ConsumeToken(); - } else if (Tok.isOneOf(tok::greater, tok::greatergreater)) { + } else if (Tok.isOneOf(tok::greater, tok::greatergreater, + tok::greatergreatergreater)) { // Don't consume this... that's done by template parser. break; } else { diff --git a/clang/test/Parser/cuda-template-angle-brackets.cu b/clang/test/Parser/cuda-template-angle-brackets.cu new file mode 100644 index 0000000000000..39fdeffef5b37 --- /dev/null +++ b/clang/test/Parser/cuda-template-angle-brackets.cu @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// expected-error@+1 {{version control conflict marker in file}} +<<<<<<< HEAD +template <template <template <int>>> struct S; // expected-error 2 {{template template parameter requires 'class' or 'typename' after the parameter list}} +======= +template <template <int>> typename T; +>>>>>>> other-branch _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
