summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaTemplate/temp_param.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-02-10 19:49:53 +0000
committerDouglas Gregor <dgregor@apple.com>2009-02-10 19:49:53 +0000
commitdba326363c4453525dc650242dfa7be97cd53c06 (patch)
tree876d917c279fdbbd6a3d2d5af81f2713e4a6f70a /clang/test/SemaTemplate/temp_param.cpp
parentda1a632a87e6a25e2f59c470fd8365e284e488ea (diff)
downloadbcm5719-llvm-dba326363c4453525dc650242dfa7be97cd53c06.tar.gz
bcm5719-llvm-dba326363c4453525dc650242dfa7be97cd53c06.zip
Implement parsing, semantic analysis and ASTs for default template
arguments. This commit covers checking and merging default template arguments from previous declarations, but it does not cover the actual use of default template arguments when naming class template specializations. llvm-svn: 64229
Diffstat (limited to 'clang/test/SemaTemplate/temp_param.cpp')
-rw-r--r--clang/test/SemaTemplate/temp_param.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/clang/test/SemaTemplate/temp_param.cpp b/clang/test/SemaTemplate/temp_param.cpp
index 57a6cdb9454..249bf9a08d5 100644
--- a/clang/test/SemaTemplate/temp_param.cpp
+++ b/clang/test/SemaTemplate/temp_param.cpp
@@ -23,5 +23,67 @@ template<float f> struct A11; // expected-error{{a non-type template parameter c
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;
+
+// FIXME: spurious "shadow" warning!
+//template<template<class T> class = Y1,
+// template<class T> class>
+// class B1fixme;
+
+// 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;
OpenPOWER on IntegriCloud