From 2eeb0489054888b580f4b0ccf54e2df34c4a91d9 Mon Sep 17 00:00:00 2001 From: Artem Belevich Date: Fri, 21 Sep 2018 17:46:28 +0000 Subject: [PATCH] [CUDA] Fixed parsing of optional template-argument-list. We need to consider all tokens that start with '>' when we're checking for the end of an empty template argument list. Differential Revision: https://reviews.llvm.org/D52321 llvm-svn: 342752 --- clang/lib/Parse/ParseTemplate.cpp | 4 +++- clang/test/Parser/cuda-kernel-call-c++11.cu | 6 +++++- clang/test/Parser/cuda-kernel-call.cu | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp index 5af5437..26709a5 100644 --- a/clang/lib/Parse/ParseTemplate.cpp +++ b/clang/lib/Parse/ParseTemplate.cpp @@ -946,7 +946,9 @@ Parser::ParseTemplateIdAfterTemplateName(bool ConsumeLastToken, bool Invalid = false; { GreaterThanIsOperatorScope G(GreaterThanIsOperator, false); - if (Tok.isNot(tok::greater) && Tok.isNot(tok::greatergreater)) + if (!Tok.isOneOf(tok::greater, tok::greatergreater, + tok::greatergreatergreater, tok::greaterequal, + tok::greatergreaterequal)) Invalid = ParseTemplateArgumentList(TemplateArgs); if (Invalid) { diff --git a/clang/test/Parser/cuda-kernel-call-c++11.cu b/clang/test/Parser/cuda-kernel-call-c++11.cu index 8f833f7..1870b201 100644 --- a/clang/test/Parser/cuda-kernel-call-c++11.cu +++ b/clang/test/Parser/cuda-kernel-call-c++11.cu @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s -template struct S {}; +template struct S {}; template void f(); @@ -11,10 +11,14 @@ void foo(void) { // expected-no-diagnostics S>> s3; + S>> s30; S>>> s4; + S>>> s40; S>>>> s5; + S>>>> s50; (void)(&f>>==0); + (void)(&f>>==0); } diff --git a/clang/test/Parser/cuda-kernel-call.cu b/clang/test/Parser/cuda-kernel-call.cu index 1970c55..2a409aa3 100644 --- a/clang/test/Parser/cuda-kernel-call.cu +++ b/clang/test/Parser/cuda-kernel-call.cu @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -template struct S {}; +template struct S {}; template void f(); void foo(void) { @@ -13,5 +13,7 @@ void foo(void) { // The following two are parse errors because -std=c++11 is not enabled. S>> s; // expected-error 2{{use '> >'}} + S>> s1; // expected-error 2{{use '> >'}} (void)(&f>>==0); // expected-error 2{{use '> >'}} + (void)(&f>>==0); // expected-error 2{{use '> >'}} } -- 2.7.4