diff options
author | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2015-06-25 00:23:39 +0000 |
---|---|---|
committer | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2015-06-25 00:23:39 +0000 |
commit | ec3cb573f522cf6748eae8afa5b33f9b65c33d6e (patch) | |
tree | 2198fc7989005e81e19307e2c1214fff7284ae37 /clang/test/Parser/cxx-concepts-requires-clause.cpp | |
parent | 6a75acb1c2fde67614d86084d09f9debc0425d67 (diff) | |
download | bcm5719-llvm-ec3cb573f522cf6748eae8afa5b33f9b65c33d6e.tar.gz bcm5719-llvm-ec3cb573f522cf6748eae8afa5b33f9b65c33d6e.zip |
[Concepts] Parsing of requires-clause in template-declaration
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
Diffstat (limited to 'clang/test/Parser/cxx-concepts-requires-clause.cpp')
-rw-r--r-- | clang/test/Parser/cxx-concepts-requires-clause.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/clang/test/Parser/cxx-concepts-requires-clause.cpp b/clang/test/Parser/cxx-concepts-requires-clause.cpp new file mode 100644 index 00000000000..01893a94cbc --- /dev/null +++ b/clang/test/Parser/cxx-concepts-requires-clause.cpp @@ -0,0 +1,82 @@ +// 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; |