diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-08-26 22:51:28 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-08-26 22:51:28 +0000 |
commit | b26bc34e3a77cab8b2773c69f27198f77f993090 (patch) | |
tree | 196fc6c3e4e111c21deb21f5a7837de86caf4199 /clang/test | |
parent | f837bb4a3443b374b29336a9058035c15a240b9c (diff) | |
download | bcm5719-llvm-b26bc34e3a77cab8b2773c69f27198f77f993090.tar.gz bcm5719-llvm-b26bc34e3a77cab8b2773c69f27198f77f993090.zip |
PR42587: diagnose unexpanded uses of a pack parameter of a generic
lambda from within the lambda-declarator.
Instead of trying to reconstruct whether a parameter pack was declared
inside a lambda (which we can't do correctly in general because we might
not have attached parameters to their declaration contexts yet), track
the set of parameter packs introduced in each live lambda scope, and
require only those parameters to be immediately expanded when they
appear inside that lambda.
In passing, fix incorrect disambiguation of a lambda-expression starting
with an init-capture pack in a braced-init-list. We previously
incorrectly parsed that as a designated initializer.
llvm-svn: 369985
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/SemaCXX/cxx1y-generic-lambdas-variadics.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/cxx1y-generic-lambdas-variadics.cpp b/clang/test/SemaCXX/cxx1y-generic-lambdas-variadics.cpp index b8022d20912..5c1eb32ad2c 100644 --- a/clang/test/SemaCXX/cxx1y-generic-lambdas-variadics.cpp +++ b/clang/test/SemaCXX/cxx1y-generic-lambdas-variadics.cpp @@ -122,3 +122,16 @@ namespace PR33082 { b(Pack<int*, float*>(), 1, 2, 3); // expected-note {{instantiation of}} } } + +void pr42587() { + (void)[](auto... args) -> decltype(args) {}; // expected-error {{type contains unexpanded parameter pack}} + (void)[](auto... args, int = args) {}; // expected-error {{default argument contains unexpanded parameter pack}} + (void)[](auto... args, decltype(args)) {}; // expected-error {{type contains unexpanded parameter pack}} + (void)[](auto... args, decltype(args)...) {}; // (ok) + (void)[](auto... args, int = [=] { return args; }()) {}; // expected-error {{default argument contains unexpanded parameter pack}} + (void)([]<typename ...T> (T t) {} + ...); // expected-error {{contains unexpanded parameter pack 'T'}} expected-error {{does not contain any unexpanded}} expected-warning 0-2{{extension}} + (void)([]<int ...N> (int k = N) {} + ...); // expected-error {{contains unexpanded parameter pack 'N'}} expected-error {{does not contain any unexpanded}} expected-warning 0-2{{extension}} + (void)([]<template<typename> typename ...T> (T<int>) {} + ...); // expected-error {{contains unexpanded parameter pack 'T'}} expected-error {{does not contain any unexpanded}} expected-warning 0-3{{extension}} +} + +template<typename ...T> int v = {[...x = T()] { int k = x; } ...}; // expected-error {{contains unexpanded parameter pack 'x'}} expected-error {{does not contain any unexpanded}} expected-warning 0-1{{extension}} |