[clang] [clang][Parse] Improve diagnostics for '>>>' closing template parameter lists in CUDA. (PR #219638)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 30 22:24:47 PDT 2026
https://github.com/anondeveg updated https://github.com/llvm/llvm-project/pull/219638
>From 87032f5de44876c8cbb2db019e5d9313fea9d115 Mon Sep 17 00:00:00 2001
From: Anondev <anondeveg at gmail.com>
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 at +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
More information about the cfe-commits
mailing list