mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-17 13:51:21 +00:00

Summary: This change implements parse-only acceptance of the optional requires-clause in a template-declaration. Diagnostic testing is added for cases where the grammar is ambiguous with the expectation that the longest token sequence which matches the syntax of a constraint-expression is consumed without backtracking. Reviewers: faisalv, fraggamuffin, rsmith Reviewed By: rsmith Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D10462 llvm-svn: 240611
83 lines
1.5 KiB
C++
83 lines
1.5 KiB
C++
// RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ %s -verify
|
|
// expected-no-diagnostics
|
|
|
|
// Test parsing of the optional requires-clause in a template-declaration.
|
|
|
|
template <typename T> requires true
|
|
void foo() { }
|
|
|
|
|
|
template <typename T> requires !0
|
|
struct A {
|
|
void foo();
|
|
struct AA;
|
|
enum E : int;
|
|
static int x;
|
|
|
|
template <typename> requires true
|
|
void Mfoo();
|
|
|
|
template <typename> requires true
|
|
struct M;
|
|
|
|
template <typename> requires true
|
|
static int Mx;
|
|
|
|
template <typename TT> requires true
|
|
using MQ = M<TT>;
|
|
};
|
|
|
|
template <typename T> requires !0
|
|
void A<T>::foo() { }
|
|
|
|
template <typename T> requires !0
|
|
struct A<T>::AA { };
|
|
|
|
template <typename T> requires !0
|
|
enum A<T>::E : int { E0 };
|
|
|
|
template <typename T> requires !0
|
|
int A<T>::x = 0;
|
|
|
|
template <typename T> requires !0
|
|
template <typename> requires true
|
|
void A<T>::Mfoo() { }
|
|
|
|
template <typename T> requires !0
|
|
template <typename> requires true
|
|
struct A<T>::M { };
|
|
|
|
template <typename T> requires !0
|
|
template <typename> requires true
|
|
int A<T>::Mx = 0;
|
|
|
|
|
|
template <typename T> requires true
|
|
int x = 0;
|
|
|
|
template <typename T> requires true
|
|
using Q = A<T>;
|
|
|
|
struct C {
|
|
template <typename> requires true
|
|
void Mfoo();
|
|
|
|
template <typename> requires true
|
|
struct M;
|
|
|
|
template <typename> requires true
|
|
static int Mx;
|
|
|
|
template <typename T> requires true
|
|
using MQ = M<T>;
|
|
};
|
|
|
|
template <typename> requires true
|
|
void C::Mfoo() { }
|
|
|
|
template <typename> requires true
|
|
struct C::M { };
|
|
|
|
template <typename> requires true
|
|
int C::Mx = 0;
|