summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/vartemplate-lambda.cpp
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2016-12-16 21:16:57 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2016-12-16 21:16:57 +0000
commit40281846a1972e69c0a1bc12c0584fa88391c942 (patch)
tree211a6cee302d5c33413e94dfed1ac4c7d3254d70 /clang/test/SemaCXX/vartemplate-lambda.cpp
parent193ee2db477f8928b4d311bac2266a8270d0f728 (diff)
downloadbcm5719-llvm-40281846a1972e69c0a1bc12c0584fa88391c942.tar.gz
bcm5719-llvm-40281846a1972e69c0a1bc12c0584fa88391c942.zip
[Sema] Transform the default arguments of a lambda expression when the
lambda expression is instantiated. Rather than waiting until Sema::CheckCXXDefaultArgExpr tries to transform the default arguments (which fails because it can't get the template arguments that are used), transform the default arguments earlier when the lambda expression is transformed in TransformLambdaExpr. rdar://problem/27535319 Differential Revision: https://reviews.llvm.org/D23096 llvm-svn: 289990
Diffstat (limited to 'clang/test/SemaCXX/vartemplate-lambda.cpp')
-rw-r--r--clang/test/SemaCXX/vartemplate-lambda.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/vartemplate-lambda.cpp b/clang/test/SemaCXX/vartemplate-lambda.cpp
index 9dab6da3d1e..5b91e232e3a 100644
--- a/clang/test/SemaCXX/vartemplate-lambda.cpp
+++ b/clang/test/SemaCXX/vartemplate-lambda.cpp
@@ -1,18 +1,36 @@
// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s
-// expected-no-diagnostics
template <class> auto fn0 = [] {};
template <typename> void foo0() { fn0<char>(); }
template<typename T> auto fn1 = [](auto a) { return a + T(1); };
+template<typename T> auto v1 = [](int a = T(1)) { return a; }();
+
+struct S {
+ template<class T>
+ static constexpr T t = [](int f = T(7)){return f;}(); // expected-error{{constexpr variable 't<int>' must be initialized by a constant expression}} expected-error{{a lambda expression may not appear inside of a constant expression}} expected-note{{cannot be used in a constant expression}}
+};
template <typename X>
int foo2() {
X a = 0x61;
fn1<char>(a);
+ (void)v1<int>;
+ (void)S::t<int>; // expected-note{{in instantiation of static data member 'S::t<int>' requested here}}
return 0;
}
+template<class C>
+int foo3() {
+ C::m1(); // expected-error{{type 'long long' cannot be used prior to '::' because it has no members}}
+ return 1;
+}
+
+template<class C>
+auto v2 = [](int a = foo3<C>()){}; // expected-note{{in instantiation of function template specialization 'foo3<long long>' requested here}}
+
int main() {
+ v2<long long>(); // This line causes foo3<long long> to be instantiated.
+ v2<long long>(2); // This line does not.
foo2<int>();
}
OpenPOWER on IntegriCloud