diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-06-13 06:59:07 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-06-13 06:59:07 +0000 |
commit | 247baca66ca998de9c415c19019e199f4895e81c (patch) | |
tree | 0ab3101791dedf4f4295d7c07604b1cd723c69c7 | |
parent | cb8845f3e358b8583c41ba9bdb9165670900a8e2 (diff) |
Move a bunch of tests into temp.param, and write a few tests for paragraphs that hadn't been touched before
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73288 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/CXX/temp/temp.param/p1.cpp | 1 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p10.cpp | 12 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p11.cpp | 15 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p12.cpp | 37 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p13.cpp | 14 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p14.cpp | 5 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p15-cxx0x.cpp (renamed from test/SemaTemplate/right-angle-brackets-0x.cpp) | 0 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p15.cpp (renamed from test/SemaTemplate/right-angle-brackets-98.cpp) | 0 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p2.cpp | 16 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p3.cpp | 28 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p4.cpp | 20 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p7.cpp | 15 | ||||
-rw-r--r-- | test/CXX/temp/temp.param/p8.cpp | 6 | ||||
-rw-r--r-- | test/SemaTemplate/temp_param.cpp | 90 |
14 files changed, 169 insertions, 90 deletions
diff --git a/test/CXX/temp/temp.param/p1.cpp b/test/CXX/temp/temp.param/p1.cpp new file mode 100644 index 0000000000..488c3a0742 --- /dev/null +++ b/test/CXX/temp/temp.param/p1.cpp @@ -0,0 +1 @@ +// Paragraph 1 is descriptive, and therefore requires no tests. diff --git a/test/CXX/temp/temp.param/p10.cpp b/test/CXX/temp/temp.param/p10.cpp new file mode 100644 index 0000000000..56e7f3281e --- /dev/null +++ b/test/CXX/temp/temp.param/p10.cpp @@ -0,0 +1,12 @@ +// RUN: clang-cc -fsyntax-only -verify %s +template<typename> struct Y1; +template<typename, int> struct Y2; + +template<class T1, class T2 = int> class B2; +template<class T1 = int, class T2> class B2; + +template<template<class, int> class, template<class> class = Y1> class B2t; +template<template<class, int> class = Y2, template<class> class> class B2t; + +template<int N, int M = 5> class B2n; +template<int N = 5, int M> class B2n; diff --git a/test/CXX/temp/temp.param/p11.cpp b/test/CXX/temp/temp.param/p11.cpp new file mode 100644 index 0000000000..9e7fd39c0a --- /dev/null +++ b/test/CXX/temp/temp.param/p11.cpp @@ -0,0 +1,15 @@ +// RUN: clang-cc -fsyntax-only -verify %s +template<typename> struct Y1; +template<typename, int> struct Y2; + +template<class T1 = int, // expected-note{{previous default template argument defined here}} + class T2> // expected-error{{template parameter missing a default argument}} + class B1; + +template<template<class> class = Y1, // expected-note{{previous default template argument defined here}} + template<class> class> // expected-error{{template parameter missing a default argument}} + class B1t; + +template<int N = 5, // expected-note{{previous default template argument defined here}} + int M> // expected-error{{template parameter missing a default argument}} + class B1n; diff --git a/test/CXX/temp/temp.param/p12.cpp b/test/CXX/temp/temp.param/p12.cpp new file mode 100644 index 0000000000..5511224ebe --- /dev/null +++ b/test/CXX/temp/temp.param/p12.cpp @@ -0,0 +1,37 @@ +// RUN: clang-cc -fsyntax-only -verify %s +template<typename> struct Y1; // expected-note{{too few template parameters in template template argument}} +template<typename, int> struct Y2; + +// C++ [temp.param]p12: +template<class T1, + class T2 = int> // expected-note{{previous default template argument defined here}} + class B3; +template<class T1, typename T2> class B3; +template<class T1, + typename T2 = float> // expected-error{{template parameter redefines default argument}} + class B3; + +template<template<class, int> class, + template<class> class = Y1> // expected-note{{previous default template argument defined here}} + class B3t; + +template<template<class, int> class, template<class> class> class B3t; + +template<template<class, int> class, + template<class> class = Y1> // expected-error{{template parameter redefines default argument}} + class B3t; + +template<int N, + int M = 5> // expected-note{{previous default template argument defined here}} + class B3n; + +template<int N, int M> class B3n; + +template<int N, + int M = 7> // expected-error{{template parameter redefines default argument}} + class B3n; + +// Check validity of default arguments +template<template<class, int> class // expected-note{{previous template template parameter is here}} + = Y1> // expected-error{{template template argument has different template parameters than its corresponding template template parameter}} + class C1; diff --git a/test/CXX/temp/temp.param/p13.cpp b/test/CXX/temp/temp.param/p13.cpp new file mode 100644 index 0000000000..559b892d0f --- /dev/null +++ b/test/CXX/temp/temp.param/p13.cpp @@ -0,0 +1,14 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// The scope of atemplate-parameterextends from its point of +// declaration until the end of its template. In particular, a +// template-parameter can be used in the declaration of subsequent +// template-parameters and their default arguments. + +template<class T, T* p, class U = T> class X { /* ... */ }; +// FIXME: template<class T> void f(T* p = new T); + +// Check for bogus template parameter shadow warning. +template<template<class T> class, + template<class T> class> + class B1noshadow; diff --git a/test/CXX/temp/temp.param/p14.cpp b/test/CXX/temp/temp.param/p14.cpp new file mode 100644 index 0000000000..07e6bfe409 --- /dev/null +++ b/test/CXX/temp/temp.param/p14.cpp @@ -0,0 +1,5 @@ +// RUN: clang-cc -fsyntax-only -verify %s +// XFAIL + +// A template-parameter shall not be used in its own default argument. +template<typename T = typename T::type> struct X; // expected-error{{default}} diff --git a/test/SemaTemplate/right-angle-brackets-0x.cpp b/test/CXX/temp/temp.param/p15-cxx0x.cpp index 57b6ee2241..57b6ee2241 100644 --- a/test/SemaTemplate/right-angle-brackets-0x.cpp +++ b/test/CXX/temp/temp.param/p15-cxx0x.cpp diff --git a/test/SemaTemplate/right-angle-brackets-98.cpp b/test/CXX/temp/temp.param/p15.cpp index 764bb7bae0..764bb7bae0 100644 --- a/test/SemaTemplate/right-angle-brackets-98.cpp +++ b/test/CXX/temp/temp.param/p15.cpp diff --git a/test/CXX/temp/temp.param/p2.cpp b/test/CXX/temp/temp.param/p2.cpp new file mode 100644 index 0000000000..a402cf6f88 --- /dev/null +++ b/test/CXX/temp/temp.param/p2.cpp @@ -0,0 +1,16 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// There is no semantic difference between class and typename in a +// template-parameter. typename followed by an unqualified-id names a +// template type parameter. +template<class T> struct X; +template<typename T> struct X; + +// typename followed by aqualified-id denotes the type in a non-type +// parameter-declaration. +// FIXME: template<typename T, typename T::type Value> struct Y; + +// A storage class shall not be specified in a template-parameter declaration. +template<static int Value> struct Z; // FIXME: expect an error + +// FIXME: add the example from p2 diff --git a/test/CXX/temp/temp.param/p3.cpp b/test/CXX/temp/temp.param/p3.cpp new file mode 100644 index 0000000000..6a76fe20b8 --- /dev/null +++ b/test/CXX/temp/temp.param/p3.cpp @@ -0,0 +1,28 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// A type-parameter defines its identifier to be a type-name (if +// declared with class or typename) or template-name (if declared with +// template) in the scope of the template declaration. +template<typename T> struct X0 { + T* value; +}; + +template<template<class T> class Y> struct X1 { + Y<int> value; +}; + +// [Note: because of the name lookup rules, a template-parameter that +// could be interpreted as either a non-type template-parameter or a +// type-parameter (because its identifier is the name of an already +// existing class) is taken as a type-parameter. For example, +class T { /* ... */ }; +int i; + +template<class T, T i> struct X2 { + void f(T t) + { + T t1 = i; //template-parameters T and i + ::T t2 = ::i; // global namespace members T and i \ + // expected-error{{cannot initialize}} + } +}; diff --git a/test/CXX/temp/temp.param/p4.cpp b/test/CXX/temp/temp.param/p4.cpp new file mode 100644 index 0000000000..3efff12436 --- /dev/null +++ b/test/CXX/temp/temp.param/p4.cpp @@ -0,0 +1,20 @@ +// RUN: clang-cc -fsyntax-only -verify %s +class X; + +// C++ [temp.param]p4 +typedef int INT; +enum E { enum1, enum2 }; +template<int N> struct A1; +template<INT N, INT M> struct A2; +template<enum E x, E y> struct A3; +template<int &X> struct A4; +template<int *Ptr> struct A5; +template<int (&f)(int, int)> struct A6; +template<int (*fp)(float, double)> struct A7; +template<int X::*pm> struct A8; +template<float (X::*pmf)(float, int)> struct A9; +template<typename T, T x> struct A10; + +template<float f> struct A11; // expected-error{{a non-type template parameter cannot have type 'float'}} + +template<void *Ptr> struct A12; // expected-error{{a non-type template parameter cannot have type 'void *'}} diff --git a/test/CXX/temp/temp.param/p7.cpp b/test/CXX/temp/temp.param/p7.cpp new file mode 100644 index 0000000000..ccc869ae0f --- /dev/null +++ b/test/CXX/temp/temp.param/p7.cpp @@ -0,0 +1,15 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// A non-type template-parameter shall not be declared to have +// floating point, class, or void type. +struct A; + +template<double d> class X; // expected-error{{cannot have type}} +template<double* pd> class Y; //OK +template<double& rd> class Z; //OK + +template<A a> class X0; // expected-error{{cannot have type}} + +typedef void VOID; +template<VOID a> class X01; // expected-error{{cannot have type}} + diff --git a/test/CXX/temp/temp.param/p8.cpp b/test/CXX/temp/temp.param/p8.cpp new file mode 100644 index 0000000000..dd4af17d79 --- /dev/null +++ b/test/CXX/temp/temp.param/p8.cpp @@ -0,0 +1,6 @@ +// RUN: clang-cc -fsyntax-only -verify %s +template<int X[10]> struct A; +template<int *X> struct A; +template<int f(float, double)> struct B; +typedef float FLOAT; +template<int (*f)(FLOAT, double)> struct B; diff --git a/test/SemaTemplate/temp_param.cpp b/test/SemaTemplate/temp_param.cpp deleted file mode 100644 index c042f0849a..0000000000 --- a/test/SemaTemplate/temp_param.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// RUN: clang-cc -fsyntax-only -verify %s - -class X; - -// C++ [temp.param]p4 -typedef int INT; -enum E { enum1, enum2 }; -template<int N> struct A1; -template<INT N, INT M> struct A2; -template<enum E x, E y> struct A3; -template<int &X> struct A4; -template<int *Ptr> struct A5; -template<int (&f)(int, int)> struct A6; -template<int (*fp)(float, double)> struct A7; -template<int X::*pm> struct A8; -template<float (X::*pmf)(float, int)> struct A9; -template<typename T, T x> struct A10; - -template<float f> struct A11; // expected-error{{a non-type template parameter cannot have type 'float'}} - -template<void *Ptr> struct A12; // expected-error{{a non-type template parameter cannot have type 'void *'}} - -// C++ [temp.param]p8 -template<int X[10]> struct A5; -template<int f(float, double)> struct A7; - -// C++ [temp.param]p11: -template<typename> struct Y1; // expected-note{{too few template parameters in template template argument}} -template<typename, int> struct Y2; - -template<class T1 = int, // expected-note{{previous default template argument defined here}} - class T2> // expected-error{{template parameter missing a default argument}} - class B1; - -template<template<class> class = Y1, // expected-note{{previous default template argument defined here}} - template<class> class> // expected-error{{template parameter missing a default argument}} - class B1t; - -template<int N = 5, // expected-note{{previous default template argument defined here}} - int M> // expected-error{{template parameter missing a default argument}} - class B1n; - -// Check for bogus template parameter shadow warning. -template<template<class T> class, - template<class T> class> - class B1noshadow; - -// C++ [temp.param]p10: -template<class T1, class T2 = int> class B2; -template<class T1 = int, class T2> class B2; - -template<template<class, int> class, template<class> class = Y1> class B2t; -template<template<class, int> class = Y2, template<class> class> class B2t; - -template<int N, int M = 5> class B2n; -template<int N = 5, int M> class B2n; - -// C++ [temp.param]p12: -template<class T1, - class T2 = int> // expected-note{{previous default template argument defined here}} - class B3; -template<class T1, typename T2> class B3; -template<class T1, - typename T2 = float> // expected-error{{template parameter redefines default argument}} - class B3; - -template<template<class, int> class, - template<class> class = Y1> // expected-note{{previous default template argument defined here}} - class B3t; - -template<template<class, int> class, template<class> class> class B3t; - -template<template<class, int> class, - template<class> class = Y1> // expected-error{{template parameter redefines default argument}} - class B3t; - -template<int N, - int M = 5> // expected-note{{previous default template argument defined here}} - class B3n; - -template<int N, int M> class B3n; - -template<int N, - int M = 7> // expected-error{{template parameter redefines default argument}} - class B3n; - -// Check validity of default arguments -template<template<class, int> class // expected-note{{previous template template parameter is here}} - = Y1> // expected-error{{template template argument has different template parameters than its corresponding template template parameter}} - class C1; |