diff options
author | Michael Liao <michael.hliao@gmail.com> | 2019-05-08 00:52:33 +0000 |
---|---|---|
committer | Michael Liao <michael.hliao@gmail.com> | 2019-05-08 00:52:33 +0000 |
commit | 0fb707b93b938e216770297446b2de71a09ce378 (patch) | |
tree | 50c287407aa60028a74fdec4a51c22269f35a309 | |
parent | 219b2b3a4a7805060673459cb5652d6db510108a (diff) | |
download | llvm-0fb707b93b938e216770297446b2de71a09ce378.zip llvm-0fb707b93b938e216770297446b2de71a09ce378.tar.gz llvm-0fb707b93b938e216770297446b2de71a09ce378.tar.bz2 |
[hip] Fix ambiguity from `>>>` of CUDA.
Summary:
- For template arguments ending with `>>>`, we should cease lookahead
and treat it as type-id firstly, so that deduction could work
properly.
Reviewers: tra, yaxunl
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D61396
llvm-svn: 360214
-rw-r--r-- | clang/lib/Parse/ParseTentative.cpp | 4 | ||||
-rw-r--r-- | clang/test/Parser/cuda-kernel-call-c++11.cu | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp index de9391cd..0504f0d 100644 --- a/clang/lib/Parse/ParseTentative.cpp +++ b/clang/lib/Parse/ParseTentative.cpp @@ -590,9 +590,11 @@ bool Parser::isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous) { } else if (Context == TypeIdAsTemplateArgument && (Tok.isOneOf(tok::greater, tok::comma) || (getLangOpts().CPlusPlus11 && - (Tok.is(tok::greatergreater) || + (Tok.isOneOf(tok::greatergreater, + tok::greatergreatergreater) || (Tok.is(tok::ellipsis) && NextToken().isOneOf(tok::greater, tok::greatergreater, + tok::greatergreatergreater, tok::comma)))))) { TPR = TPResult::True; isAmbiguous = true; diff --git a/clang/test/Parser/cuda-kernel-call-c++11.cu b/clang/test/Parser/cuda-kernel-call-c++11.cu index 1870b20..ef71e2a 100644 --- a/clang/test/Parser/cuda-kernel-call-c++11.cu +++ b/clang/test/Parser/cuda-kernel-call-c++11.cu @@ -3,6 +3,10 @@ template<typename T=int> struct S {}; template<typename> void f(); +template<typename T, typename... V> struct S<T(V...)> {}; + +template<typename ...T> struct V {}; +template<typename ...T> struct V<void(T)...> {}; void foo(void) { // In C++11 mode, all of these are expected to parse correctly, and the CUDA @@ -21,4 +25,11 @@ void foo(void) { (void)(&f<S<S<int>>>==0); (void)(&f<S<S<>>>==0); + + S<S<S<void()>>> s6; +} + +template<typename ...T> +void bar(T... args) { + S<S<V<void(T)...>>> s7; } |