Author: hliao Date: Tue May 7 17:52:33 2019 New Revision: 360214 URL: http://llvm.org/viewvc/llvm-project?rev=360214&view=rev Log: [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 Modified: cfe/trunk/lib/Parse/ParseTentative.cpp cfe/trunk/test/Parser/cuda-kernel-call-c++11.cu Modified: cfe/trunk/lib/Parse/ParseTentative.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTentative.cpp?rev=360214&r1=360213&r2=360214&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseTentative.cpp (original) +++ cfe/trunk/lib/Parse/ParseTentative.cpp Tue May 7 17:52:33 2019 @@ -590,9 +590,11 @@ bool Parser::isCXXTypeId(TentativeCXXTyp } 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; Modified: cfe/trunk/test/Parser/cuda-kernel-call-c++11.cu URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cuda-kernel-call-c%2B%2B11.cu?rev=360214&r1=360213&r2=360214&view=diff ============================================================================== --- cfe/trunk/test/Parser/cuda-kernel-call-c++11.cu (original) +++ cfe/trunk/test/Parser/cuda-kernel-call-c++11.cu Tue May 7 17:52:33 2019 @@ -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; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits