mirror of
https://github.com/intel/llvm.git
synced 2026-01-31 16:29:50 +08:00
[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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user