diff options
| author | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2017-02-10 02:46:19 +0000 |
|---|---|---|
| committer | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2017-02-10 02:46:19 +0000 |
| commit | 5a8ec4e287f51cd64351d7c5be63c498e7d85f07 (patch) | |
| tree | a77c931a539a202840fd301c6b56d261d21258ec /clang/test/CXX/concepts-ts/temp/temp.constr/temp.constr.decl/class-template-decl.cpp | |
| parent | 48b4b047005f5680452dcaa0a4811fb3b2cfb8bb (diff) | |
| download | bcm5719-llvm-5a8ec4e287f51cd64351d7c5be63c498e7d85f07.tar.gz bcm5719-llvm-5a8ec4e287f51cd64351d7c5be63c498e7d85f07.zip | |
[Concepts] Class template associated constraints
Summary:
This adds associated constraints as a property of class templates.
An error is produced if redeclarations are not similarly constrained.
Reviewers: rsmith, faisalv, aaron.ballman
Reviewed By: rsmith
Subscribers: cfe-commits, nwilson
Differential Revision: https://reviews.llvm.org/D25674
llvm-svn: 294697
Diffstat (limited to 'clang/test/CXX/concepts-ts/temp/temp.constr/temp.constr.decl/class-template-decl.cpp')
| -rw-r--r-- | clang/test/CXX/concepts-ts/temp/temp.constr/temp.constr.decl/class-template-decl.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/clang/test/CXX/concepts-ts/temp/temp.constr/temp.constr.decl/class-template-decl.cpp b/clang/test/CXX/concepts-ts/temp/temp.constr/temp.constr.decl/class-template-decl.cpp new file mode 100644 index 00000000000..d1ad0404ef4 --- /dev/null +++ b/clang/test/CXX/concepts-ts/temp/temp.constr/temp.constr.decl/class-template-decl.cpp @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ -verify %s + +namespace nodiag { + +template <typename T> requires bool(T()) +struct A; +template <typename U> requires bool(U()) +struct A; + +} // end namespace nodiag + +namespace diag { + +template <typename T> requires true // expected-note{{previous template declaration is here}} +struct A; +template <typename T> struct A; // expected-error{{associated constraints differ in template redeclaration}} + +template <typename T> struct B; // expected-note{{previous template declaration is here}} +template <typename T> requires true // expected-error{{associated constraints differ in template redeclaration}} +struct B; + +template <typename T> requires true // expected-note{{previous template declaration is here}} +struct C; +template <typename T> requires !0 // expected-error{{associated constraints differ in template redeclaration}} +struct C; + +} // end namespace diag + +namespace nodiag { + +struct AA { + template <typename T> requires someFunc(T()) + struct A; +}; + +template <typename T> requires someFunc(T()) +struct AA::A { }; + +struct AAF { + template <typename T> requires someFunc(T()) + friend struct AA::A; +}; + +} // end namespace nodiag + +namespace diag { + +template <unsigned N> +struct TA { + template <template <unsigned> class TT> requires TT<N>::happy // expected-note 2{{previous template declaration is here}} + struct A; + + struct AF; +}; + +template <unsigned N> +template <template <unsigned> class TT> struct TA<N>::A { }; // expected-error{{associated constraints differ in template redeclaration}} + +template <unsigned N> +struct TA<N>::AF { + template <template <unsigned> class TT> requires TT<N + 0>::happy // expected-error{{associated constraints differ in template redeclaration}} + friend struct TA::A; +}; + +} // end namespace diag |

