4967a710c84587c654b56c828382219c3937dacb |
20-Sep-2016 |
Pirama Arumuga Nainar <pirama@google.com> |
Update aosp/master Clang for rebase to r275480 Bug: http://b/31320715 This merges commit ac9cc4764cf47a6c3f031687d8592e080c9f5001 from aosp/dev. Test: Build AOSP and run RenderScript tests (host tests for slang and libbcc, RsTest, CTS) Change-Id: Ic2875e5c3673c83448cd7d1013861e42947b1b55
15-star-this-capture.cpp
5.cpp
|
87d948ecccffea9e9e37d0d053b246e2d6d6c47b |
04-Mar-2016 |
Pirama Arumuga Nainar <pirama@google.com> |
Update aosp/master clang for rebase to r256229 http://b/26987366 Change-Id: I5d349c9843ea5c24d6e455956f8a446393b6873d
efault-arguments.cpp
11-1y.cpp
emplates.cpp
|
b6d6993e6e6d3daf4d9876794254d20a134e37c2 |
01-Jul-2015 |
Pirama Arumuga Nainar <pirama@google.com> |
Update aosp/master clang for rebase to r239765 Change-Id: I0393bcc952590a7226af8c4b58534a8ee5fd2d99
16.cpp
2.cpp
emplates.cpp
|
0e2c34f92f00628d48968dfea096d36381f494cb |
23-Mar-2015 |
Stephen Hines <srhines@google.com> |
Update aosp/master clang for rebase to r230699. Change-Id: I6a546ab3d4ae37119eebb735e102cca4f80ab520
11-1y.cpp
19.cpp
2-generic-lambda-1y.cpp
2.cpp
3.cpp
4.cpp
|
176edba5311f6eff0cad2631449885ddf4fbc9ea |
01-Dec-2014 |
Stephen Hines <srhines@google.com> |
Update aosp/master Clang for rebase to r222490. Change-Id: Ic557ac55e97fbf6ee08771c7b7c3594777b0aefd
3.cpp
emplates.cpp
|
6bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89 |
29-May-2014 |
Stephen Hines <srhines@google.com> |
Update Clang for 3.5 rebase (r209713). Change-Id: I8c9133b0f8f776dc915f270b60f94962e771bc83
locks.mm
|
651f13cea278ec967336033dd032faef0e9fc2ec |
24-Apr-2014 |
Stephen Hines <srhines@google.com> |
Updated to Clang 3.5a. Change-Id: I8127eb568f674c2e72635b639a3295381fe8af82
locks.mm
eneric-lambda-unimplemented-1y.cpp
14.cpp
19.cpp
2-generic-lambda-1y.cpp
5-generic-lambda-1y.cpp
|
c00e4194296e994efab0e4bf64ca66737850bdf0 |
07-Nov-2013 |
Faisal Vali <faisalv@yahoo.com> |
This patch implements capturing of variables within generic lambdas. Both Richard and I felt that the current wording in the working paper needed some tweaking - Please see http://llvm-reviews.chandlerc.com/D2035 for additional context and references to core-reflector messages that discuss wording tweaks. What is implemented is what we had intended to specify in Bristol; but, recently felt that the specification might benefit from some tweaking and fleshing. As a rough attempt to explain the semantics: If a nested lambda with a default-capture names a variable within its body, and if the enclosing full expression that contains the name of that variable is instantiation-dependent - then an enclosing lambda that is capture-ready (i.e. within a non-dependent context) must capture that variable, if all intervening nested lambdas can potentially capture that variable if they need to, and all intervening parent lambdas of the capture-ready lambda can and do capture the variable. Of note, 'this' capturing is also currently underspecified in the working paper for generic lambdas. What is implemented here is if the set of candidate functions in a nested generic lambda includes both static and non-static member functions (regardless of viability checking - i.e. num and type of parameters/arguments) - and if all intervening nested-inner lambdas between the capture-ready lambda and the function-call containing nested lambda can capture 'this' and if all enclosing lambdas of the capture-ready lambda can capture 'this', then 'this' is speculatively captured by that capture-ready lambda. Hopefully a paper for the C++ committee (that Richard and I had started some preliminary work on) is forthcoming. This essentially makes generic lambdas feature complete, except for known bugs. The more prominent ones (and the ones I am currently aware of) being: - generic lambdas and init-captures are broken - but a patch that fixes this is already in the works ... - nested variadic expansions such as: auto K = [](auto ... OuterArgs) { vp([=](auto ... Is) { decltype(OuterArgs) OA = OuterArgs; return 0; }(5)...); return 0; }; auto M = K('a', ' ', 1, " -- ", 3.14); currently cause crashes. I think I know how to fix this (since I had done so in my initial implementation) - but it will probably take some work and back & forth with Doug and Richard. A warm thanks to all who provided feedback - and especially to Doug Gregor and Richard Smith for their pivotal guidance: their insight and prestidigitation in such matters is boundless! Now let's hope this commit doesn't upset the buildbot gods ;) Thanks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194188 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
2-generic-lambda-1y.cpp
5-generic-lambda-1y.cpp
|
a3d311e468bce37defb97ed75105f8d36942b651 |
23-Oct-2013 |
Faisal Vali <faisalv@yahoo.com> |
And Again: Teach TreeTransform how to transform nested generic lambdas. A previous attempt http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130930/090049.html resulted in PR 17476, and was reverted, The original TransformLambdaExpr (pre generic-lambdas) transformed the TypeSourceInfo of the Call operator in its own instantiation scope via TransformType. This resulted in the parameters of the call operator being mapped to their transformed counterparts in an instantiation scope that would get popped off. Then a call to TransformFunctionParameters would add the parameters and their transformed mappings (but newly created ones!) to the current instantiation scope. This would result in a disconnect between the new call operator's TSI parameters and those used to construct the call operator declaration. This was ok in the non-generic lambda world - but would cause issues with nested transformations (when non-generic and generics were interleaved) in the generic lambda world - that I somewhat kludged around initially - but this resulted in PR17476. The new approach seems cleaner. We only do the transformation of the TypeSourceInfo - but we make sure to do it in the current instantiation scope so we don't lose the untransformed to transformed mappings of the ParmVarDecls when they get created. Another attempt caused a test to fail (http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131021/091533.html) and also had to be reverted - my apologies - in my haste, i did not run all the tests - argh! Now all the tests seem to pass - but a Fixme has been added - since I suspect Richard will find the fix a little inelegant ;) I shall try and work on a more elegant fix once I have had a chance to discuss with Richard or Doug at a later date. Hopefully the third time;s a charm *fingers crossed* This does not yet include capturing. Please see test file for examples. This patch was LGTM'd by Doug: http://llvm-reviews.chandlerc.com/D1784 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193230 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
80f2b2e693422f84ec3735f16a08614a527b0bc5 |
23-Oct-2013 |
Rafael Espindola <rafael.espindola@gmail.com> |
Revert r193223 and r193216. They were causing CodeGenCXX/mangle-exprs.cpp to fail. Revert "Remove the circular reference to LambdaExpr in CXXRecordDecl." Revert "Again: Teach TreeTransform and family how to transform generic lambdas nested within templates and themselves." git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193226 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
b814a2ac581f7aa31aeef1abb8567ea123a13519 |
23-Oct-2013 |
Faisal Vali <faisalv@yahoo.com> |
Again: Teach TreeTransform and family how to transform generic lambdas nested within templates and themselves. A previous attempt http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130930/090049.html resulted in PR 17476, and was reverted, The original TransformLambdaExpr (pre generic-lambdas) transformed the TypeSourceInfo of the Call operator in its own instantiation scope via TransformType. This resulted in the parameters of the call operator being mapped to their transformed counterparts in an instantiation scope that would get popped off. Then a call to TransformFunctionParameters would add the parameters and their transformed mappings (but newly created ones!) to the current instantiation scope. This would result in a disconnect between the new call operator's TSI parameters and those used to construct the call operator declaration. This was ok in the non-generic lambda world - but would cause issues with nested transformations (when non-generic and generics were interleaved) in the generic lambda world - that I somewhat kludged around initially - but this resulted in PR17476. The new approach seems cleaner. We only do the transformation of the TypeSourceInfo - but we make sure to do it in the current instantiation scope so we don't lose the untransformed to transformed mappings of the ParmVarDecls when they get created. This does not yet include capturing. Please see test file for examples. This patch was LGTM'd by Doug: http://llvm-reviews.chandlerc.com/D1784 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193216 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
730a2c2f915d81f6cdb53918d8b155ee25b8175f |
11-Oct-2013 |
Douglas Gregor <dgregor@apple.com> |
Diagnose by-copy captures of abstract classes. Fixes <rdar://problem/14468891>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192419 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
|
f003acd8e7bdb994743dc8ea64f90db5360a8b4a |
04-Oct-2013 |
Rafael Espindola <rafael.espindola@gmail.com> |
Revert "Teach TreeTransform and family how to transform generic lambdas within templates and nested within themselves." This reverts commit r191879. It caused llvm.org/pr17476. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191955 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
618c28547a7f7cc785a6c6301f79febf5a584f9e |
03-Oct-2013 |
Faisal Vali <faisalv@yahoo.com> |
Teach TreeTransform and family how to transform generic lambdas within templates and nested within themselves. This does not yet include capturing (that is next). Please see test file for examples. This patch was LGTM'd by Doug: http://llvm-reviews.chandlerc.com/D1784 http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130930/090048.html When I first committed this patch - a bunch of buildbots were unable to compile the code that VS2010 seemed to compile. Seems like there was a dependency on Sema/Template.h which VS did not seem to need, but I have now added for the other compilers. It still compiles on Visual Studio 2010 - lets hope the buildbots remain quiet (please!) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191879 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
9683f1de5f8eb3a4dd7c7fcb4ff58033b9cfa46f |
03-Oct-2013 |
Faisal Vali <faisalv@yahoo.com> |
Revert changes from the nested lambdas commit till i figure out why the buildbots are failing. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191876 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
aecbb9de3bed4372695756f18af2c1304a81e7c4 |
03-Oct-2013 |
Faisal Vali <faisalv@yahoo.com> |
Teach TreeTransform and family how to transform generic lambdas within templates and nested within themselves. This does not yet include capturing (that is next). Please see test file for examples. This patch was LGTM'd by Doug: http://llvm-reviews.chandlerc.com/D1784 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191875 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
d6992ab33b7113e1bd7af51c0c52d17c23706c01 |
29-Sep-2013 |
Faisal Vali <faisalv@yahoo.com> |
Implement conversion to function pointer for generic lambdas without captures. The general strategy is to create template versions of the conversion function and static invoker and then during template argument deduction of the conversion function, create the corresponding call-operator and static invoker specializations, and when the conversion function is marked referenced generate the body of the conversion function using the corresponding static-invoker specialization. Similarly, Codegen does something similar - when asked to emit the IR for a specialized static invoker of a generic lambda, it forwards emission to the corresponding call operator. This patch has been reviewed in person both by Doug and Richard. Richard gave me the LGTM. A few minor changes: - per Richard's request i added a simple check to gracefully inform that captures (init, explicit or default) have not been added to generic lambdas just yet (instead of the assertion violation). - I removed a few lines of code that added the call operators instantiated parameters to the currentinstantiationscope. Not only did it not handle parameter packs, but it is more relevant in the patch for nested lambdas which will follow this one, and fix that problem more comprehensively. - Doug had commented that the original implementation strategy of using the TypeSourceInfo of the call operator to create the static-invoker was flawed and allowed const as a member qualifier to creep into the type of the static-invoker. I currently kludge around it - but after my initial discussion with Doug, with a follow up session with Richard, I have added a FIXME so that a more elegant solution that involves the use of TrivialTypeSourceInfo call followed by the correct wiring of the template parameters to the functionprototypeloc is forthcoming. Thanks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191634 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
|
9beaf20b882eb83082da27a74760277bb9fc0bdd |
28-Sep-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
Add compat/extension warnings for init captures. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191609 91177308-0d34-0410-b5e6-96231b3b80d8
23.cpp
8.cpp
|
04fa7a33279808dc3e5117c41b5f84c40eeb7362 |
28-Sep-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
Per latest drafting, switch to implementing init-captures as if by declaring and capturing a variable declaration, and complete the implementation of them. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191605 91177308-0d34-0410-b5e6-96231b3b80d8
11-1y.cpp
23.cpp
|
473f8b2f5453189406e0dc6e623abb1c7b6f24be |
27-Sep-2013 |
Faisal Vali <faisalv@yahoo.com> |
Fix the test files by removing the unnecessary -emit-llvm flag (should address Matt Beaumont-Gay's concern regarding failure on a read-only filesystem) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191531 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
5-generic-lambda-1y.cpp
|
fad9e13f3cb85198f0ee5af620ba81cd78574faa |
26-Sep-2013 |
Faisal Vali <faisalv@yahoo.com> |
Implement a rudimentary form of generic lambdas. Specifically, the following features are not included in this commit: - any sort of capturing within generic lambdas - generic lambdas within template functions and nested within other generic lambdas - conversion operator for captureless lambdas - ensuring all visitors are generic lambda aware (Although I have gotten some useful feedback on my patches of the above and will be incorporating that as I submit those patches for commit) As an example of what compiles through this commit: template <class F1, class F2> struct overload : F1, F2 { using F1::operator(); using F2::operator(); overload(F1 f1, F2 f2) : F1(f1), F2(f2) { } }; auto Recursive = [](auto Self, auto h, auto ... rest) { return 1 + Self(Self, rest...); }; auto Base = [](auto Self, auto h) { return 1; }; overload<decltype(Base), decltype(Recursive)> O(Base, Recursive); int num_params = O(O, 5, 3, "abc", 3.14, 'a'); Please see attached tests for more examples. This patch has been reviewed by Doug and Richard. Minor changes (non-functionality affecting) have been made since both of them formally looked at it, but the changes involve removal of supernumerary return type deduction changes (since they are now redundant, with richard having committed a recent patch to address return type deduction for C++11 lambdas using C++14 semantics). Some implementation notes: - Add a new Declarator context => LambdaExprParameterContext to clang::Declarator to allow the use of 'auto' in declaring generic lambda parameters - Add various helpers to CXXRecordDecl to facilitate identifying and querying a closure class - LambdaScopeInfo (which maintains the current lambda's Sema state) was augmented to house the current depth of the template being parsed (id est the Parser calls Sema::RecordParsingTemplateParameterDepth) so that SemaType.cpp::ConvertDeclSpecToType may use it to immediately generate a template-parameter-type when 'auto' is parsed in a generic lambda parameter context. (i.e we do NOT use AutoType deduced to a template parameter type - Richard seemed ok with this approach). We encode that this template type was generated from an auto by simply adding $auto to the name which can be used for better diagnostics if needed. - SemaLambda.h was added to hold some common lambda utility functions (this file is likely to grow ...) - Teach Sema::ActOnStartOfFunctionDef to check whether it is being called to instantiate a generic lambda's call operator, and if so, push an appropriately prepared LambdaScopeInfo object on the stack. - various tests were added - but much more will be needed. There is obviously more work to be done, and both Richard (weakly) and Doug (strongly) have requested that LambdaExpr be removed form the CXXRecordDecl LambdaDefinitionaData in a future patch which is forthcoming. A greatful thanks to all reviewers including Eli Friedman, James Dennett, and especially the two gracious wizards (Richard Smith and Doug Gregor) who spent hours providing feedback (in person in Chicago and on the mailing lists). And yet I am certain that I have allowed unidentified bugs to creep in; bugs, that I will do my best to slay, once identified! Thanks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191453 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
2-generic-lambda-1y.cpp
4-1y.cpp
4.cpp
5-generic-lambda-1y.cpp
|
152b4e4652baedfceba1cd8115515629225e713f |
22-Aug-2013 |
Manuel Klimek <klimek@google.com> |
Revert "Implement a rudimentary form of generic lambdas." This reverts commit 606f5d7a99b11957e057e4cd1f55f931f66a42c7. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189004 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
2-generic-lambda-1y.cpp
4-1y.cpp
4.cpp
5-generic-lambda-1y.cpp
|
ecb5819a9e64fb654d46a3b270a286cc570c58ff |
22-Aug-2013 |
Faisal Vali <faisalv@yahoo.com> |
Implement a rudimentary form of generic lambdas. Specifically, the following features are not included in this commit: - any sort of capturing within generic lambdas - nested lambdas - conversion operator for captureless lambdas - ensuring all visitors are generic lambda aware As an example of what compiles: template <class F1, class F2> struct overload : F1, F2 { using F1::operator(); using F2::operator(); overload(F1 f1, F2 f2) : F1(f1), F2(f2) { } }; auto Recursive = [](auto Self, auto h, auto ... rest) { return 1 + Self(Self, rest...); }; auto Base = [](auto Self, auto h) { return 1; }; overload<decltype(Base), decltype(Recursive)> O(Base, Recursive); int num_params = O(O, 5, 3, "abc", 3.14, 'a'); Please see attached tests for more examples. Some implementation notes: - Add a new Declarator context => LambdaExprParameterContext to clang::Declarator to allow the use of 'auto' in declaring generic lambda parameters - Augment AutoType's constructor (similar to how variadic template-type-parameters ala TemplateTypeParmDecl are implemented) to accept an IsParameterPack to encode a generic lambda parameter pack. - Add various helpers to CXXRecordDecl to facilitate identifying and querying a closure class - LambdaScopeInfo (which maintains the current lambda's Sema state) was augmented to house the current depth of the template being parsed (id est the Parser calls Sema::RecordParsingTemplateParameterDepth) so that Sema::ActOnLambdaAutoParameter may use it to create the appropriate list of corresponding TemplateTypeParmDecl for each auto parameter identified within the generic lambda (also stored within the current LambdaScopeInfo). Additionally, a TemplateParameterList data-member was added to hold the invented TemplateParameterList AST node which will be much more useful once we teach TreeTransform how to transform generic lambdas. - SemaLambda.h was added to hold some common lambda utility functions (this file is likely to grow ...) - Teach Sema::ActOnStartOfFunctionDef to check whether it is being called to instantiate a generic lambda's call operator, and if so, push an appropriately prepared LambdaScopeInfo object on the stack. - Teach Sema::ActOnStartOfLambdaDefinition to set the return type of a lambda without a trailing return type to 'auto' in C++1y mode, and teach the return type deduction machinery in SemaStmt.cpp to process either C++11 and C++14 lambda's correctly depending on the flag. - various tests were added - but much more will be needed. A greatful thanks to all reviewers including Eli Friedman, James Dennett and the ever illuminating Richard Smith. And yet I am certain that I have allowed unidentified bugs to creep in; bugs, that I will do my best to slay, once identified! Thanks! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188977 91177308-0d34-0410-b5e6-96231b3b80d8
eneric-lambda-unimplemented-1y.cpp
2-generic-lambda-1y.cpp
4-1y.cpp
4.cpp
5-generic-lambda-1y.cpp
|
c99b90edb85ea0a5be6ce567a8c0147b76534e15 |
14-Aug-2013 |
Eli Friedman <eli.friedman@gmail.com> |
sizeof(void) etc. should be a hard error in C++. PR16872. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188324 91177308-0d34-0410-b5e6-96231b3b80d8
2.cpp
|
14d937afc2ad8f65dccbafeb62271e80dbd46a78 |
27-Jul-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
Handle a difference in lambda return type deduction between C++11 and C++1y: if no return type is specified, C++11 will deduce a cv-qualified return type in some cases, but C++1y never will. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187275 91177308-0d34-0410-b5e6-96231b3b80d8
4.cpp
|
8443188a8f9cbd27612b7058cdcfc53356f024a3 |
02-Jul-2013 |
Eli Friedman <eli.friedman@gmail.com> |
More fixes for block mangling. Make sure we properly treat names defined inside a block as local names. There are basically three fixes here. One, correctly treat blocks as a context where we need to use local-name mangling using the new isLocalContainerContext helper. Two, make CXXNameMangler::manglePrefix handle local names in a consistent way. Three, extend CXXNameMangler::mangleLocalName so it can mangle a block correctly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185450 91177308-0d34-0410-b5e6-96231b3b80d8
locks-irgen.mm
|
1cf7c3f8948b26395bc3293a657afb9f98878db7 |
02-Jul-2013 |
Eli Friedman <eli.friedman@gmail.com> |
Don't skip lambdas when mangling local vars. This commit rearranges the logic in CXXNameMangler::mangleLocalName and GetLocalClassDecl so that it doesn't accidentally skip over lambdas. It also reduces code duplication a bit. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185402 91177308-0d34-0410-b5e6-96231b3b80d8
locks-irgen.mm
|
07369dde9d72213bf8a48288cd8b29999af9a40c |
01-Jul-2013 |
Eli Friedman <eli.friedman@gmail.com> |
Fix mangling for block literals. Blocks, like lambdas, can be written in contexts which are required to be treated as the same under ODR. Unlike lambdas, it isn't possible to actually take the address of a block, so the mangling of the block itself doesn't matter. However, objects like static variables inside a block do need to be mangled in a consistent way. There are basically three components here. One, block literals need a consistent numbering. Two, objects/types inside a block literal need to be mangled using it. Three, objects/types inside a block literal need to have their linkage computed correctly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185372 91177308-0d34-0410-b5e6-96231b3b80d8
locks-irgen.mm
|
bace10ccf5fe3468c6232681875039961f02322d |
24-Jun-2013 |
Eli Friedman <eli.friedman@gmail.com> |
Change mangling of objects inside block literals. This changes the mangling of local static variables/etc. inside blocks to do something simple and sane. This avoids depending on the way we mangle blocks, which isn't really appropriate here. John, please take a look at this to make sure the mangling I chose is sane. Fixes <rdar://problem/14074423>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184780 91177308-0d34-0410-b5e6-96231b3b80d8
locks-irgen.mm
|
d6b698739ab157348acafcec5b06a05d3d35377d |
15-Jun-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
PR16263: Implement current direction of core issue 1376. Binding a reference to the result of a cast-to-reference-type lifetime-extends the object to which the reference inside the cast binds. This requires us to look for subobject adjustments on both the inside and the outside of the MaterializeTemporaryExpr when looking for a temporary to lifetime-extend (which we also need for core issue 616, and possibly 1213). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184024 91177308-0d34-0410-b5e6-96231b3b80d8
11-1y.cpp
|
ddb5a3926d715ab4354ca36117679e3f4d5d3e21 |
14-Jun-2013 |
Eli Friedman <eli.friedman@gmail.com> |
Unify return type checking for functions and ObjC methods. Move all the random checks for ObjC object return types to SemaType.cpp. Fixes issue with ObjC method type checking reported on cfe-dev. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184006 91177308-0d34-0410-b5e6-96231b3b80d8
4.mm
|
0d8e9646bc000bab521ce52ed294209a92298cef |
16-May-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
First pass of semantic analysis for init-captures: check the initializer, build a FieldDecl from it, and propagate both into the closure type and the LambdaExpr. You can't do much useful with them yet -- you can't use them within the body of the lambda, because we don't have a representation for "the this of the lambda, not the this of the enclosing context". We also don't have support or a representation for a nested capture of an init-capture yet, which was intended to work despite not being allowed by the current standard wording. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181985 91177308-0d34-0410-b5e6-96231b3b80d8
11-1y.cpp
23.cpp
8.cpp
|
f45c2992a3aac7591310cd824b7c7319afd432fc |
12-May-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
C++1y: provide full 'auto' return type deduction for lambda expressions. This completes the implementation of N3638. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181669 91177308-0d34-0410-b5e6-96231b3b80d8
4-1y.cpp
4.cpp
|
7974c60375b2b9dfc20defc77c9ed8c3d6d241a1 |
17-Apr-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
DR974: Lambdas can have default arguments. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179688 91177308-0d34-0410-b5e6-96231b3b80d8
efault-arguments.cpp
5.cpp
|
cd8ab51a44e80625d84126780b0d85a7732e25af |
17-Jan-2013 |
Richard Smith <richard-llvm@metafoo.co.uk> |
Implement C++11 semantics for [[noreturn]] attribute. This required splitting it apart from [[gnu::noreturn]] / __attribute__((noreturn)), since their semantics are not equivalent (for instance, we treat [[gnu::noreturn]] as affecting the function type, whereas [[noreturn]] does not). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172691 91177308-0d34-0410-b5e6-96231b3b80d8
5.cpp
emplates.cpp
|
0f46e64947bdd570a499732c4b459961627d8745 |
28-Dec-2012 |
Richard Smith <richard-llvm@metafoo.co.uk> |
Improve diagnostic wording for when an implicitly-deleted special member function is selected by overload resolution. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171190 91177308-0d34-0410-b5e6-96231b3b80d8
19.cpp
|
c3f1742bdd1ae0091d51168e111cd63861587b13 |
25-Oct-2012 |
Douglas Gregor <dgregor@apple.com> |
When capturing 'this' in a lambda, make sure to update the set of array-index starting values for the 'this' capture. Fixes <rdar://problem/12426831>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166709 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
|
8e8fb3be5bd78f0564444eca02b404566a5f3b5d |
19-Oct-2012 |
Andy Gibbs <andyg1001@hotmail.co.uk> |
Prior to adding the new "expected-no-diagnostics" directive to VerifyDiagnosticConsumer, make the necessary adjustment to 580 test-cases which will henceforth require this new directive. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166280 91177308-0d34-0410-b5e6-96231b3b80d8
15.cpp
18.cpp
20.cpp
21.cpp
|
612409ece080e814f79e06772c690d603f45fbd6 |
25-Jul-2012 |
Richard Smith <richard-llvm@metafoo.co.uk> |
PR12057: Allow variadic template pack expansions to cross lambda boundaries. Rather than adding a ContainsUnexpandedParameterPack bit to essentially every AST node, we tunnel the bit directly up to the surrounding lambda expression when we reach a context where an unexpanded pack can not normally appear. Thus any statement or declaration within a lambda can now potentially contain an unexpanded parameter pack. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160705 91177308-0d34-0410-b5e6-96231b3b80d8
locks.mm
23.cpp
|
4904bf4e84cfb48080270ebaa9005327f18ab0e5 |
26-Jun-2012 |
Fariborz Jahanian <fjahanian@apple.com> |
block literal irgen: several improvements on naming block literal helper functions. All helper functions (global and locals) use block_invoke as their prefix. Local literal helper names are prefixed by their enclosing mangled function names. Blocks in non-local initializers (e.g. a global variable or a C++11 field) are prefixed by their mangled variable name. The descriminator number added to end of the name starts off with blank (for first block) and _<N> (for the N+2-th block). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159206 91177308-0d34-0410-b5e6-96231b3b80d8
locks-irgen.mm
|
03f1eb031b84e93415b792c4b45d8da71c88e92d |
15-Jun-2012 |
Douglas Gregor <dgregor@apple.com> |
Check the parameter lists and return type of both blocks and lambdas for unexpanded parameter packs. Fixes the crash-on-invalid in PR13117. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158525 91177308-0d34-0410-b5e6-96231b3b80d8
locks.mm
|
287698336ff9f9315bf814943068d6b8261e517d |
04-Jun-2012 |
Aaron Ballman <aaron@aaronballman.com> |
Fixes some test cases that should have come along with r157943. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157947 91177308-0d34-0410-b5e6-96231b3b80d8
4.cpp
|
d57f52ca4d0e9d5d42dd6947d1e66d693625cf2c |
16-May-2012 |
Douglas Gregor <dgregor@apple.com> |
Clean up r156925, so that we only mark the capturing DeclRefExpr of a lambda as referring to a local in an enclosing scope if we're in the enclosing scope of the lambda (not it's function call operator). Also, turn the test into an IR generation test, since that's where the crashes occurred. Really fixes PR12746 / <rdar://problem/11465120>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156926 91177308-0d34-0410-b5e6-96231b3b80d8
locks-irgen.mm
locks.mm
|
29a93f810ae5277446f610e8b6cdf0985febb989 |
16-May-2012 |
Douglas Gregor <dgregor@apple.com> |
Fix code generation of variables reference expressions when mixing blocks and lambdas, based heavily on a patch from Meador Inge. Fixes PR12746 / <rdar://problem/11465120>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156925 91177308-0d34-0410-b5e6-96231b3b80d8
locks.mm
|
a85cf39786fffd6860a940523be01eb02a4935c0 |
05-Apr-2012 |
Richard Smith <richard-llvm@metafoo.co.uk> |
Improve diagnostics for invalid use of non-static members / this: * s/nonstatic/non-static/ in the diagnostics, since the latter form outvoted the former by 28-2 in our diagnostics. * Fix the "use of member in static member function" diagnostic to correctly detect this situation inside a block or lambda. * Produce a more specific "invalid use of non-static member" diagnostic for the case where a nested class member refers to a member of a lexically-surrounding class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154073 91177308-0d34-0410-b5e6-96231b3b80d8
12.cpp
|
ac6260187b6b2f26faa9264d170d649a501f58a9 |
29-Feb-2012 |
Eli Friedman <eli.friedman@gmail.com> |
Make the odr-use logic work correctly for constant-expressions. PR12006. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151699 91177308-0d34-0410-b5e6-96231b3b80d8
12.cpp
|
b734e2437d3c4b20a28b448e75cb45ef71f0b518 |
22-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Teach overload resolution to prefer user-defined conversion via a lambda closure type's function pointer conversion over user-defined conversion via a lambda closure type's block pointer conversion, always. This is a preference for more-standard code (since blocks are an extension) and a nod to efficiency, since function pointers don't require any memory management. Fixes PR12063. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151170 91177308-0d34-0410-b5e6-96231b3b80d8
locks.mm
|
ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfa |
22-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Generate an AST for the conversion from a lambda closure type to a block pointer that returns a block literal which captures (by copy) the lambda closure itself. Some aspects of the block literal are left unspecified, namely the capture variable (which doesn't actually exist) and the body (which will be filled in by IRgen because it can't be written as an AST). Because we're switching to this model, this patch also eliminates tracking the copy-initialization expression for the block capture of the conversion function, since that information is now embedded in the synthesized block literal. -1 side tables FTW. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151131 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
locks.mm
|
f4b7de1cef3007cc0479775638198287384d9af1 |
21-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Improve our handling of lambda expressions that occur within default arguments. There are two aspects to this: - Make sure that when marking the declarations referenced in a default argument, we don't try to mark local variables, both because it's a waste of time and because the semantics are wrong: we're not in a place where we could capture these variables again even if it did make sense. - When a lambda expression occurs in a default argument of a function template, make sure that the corresponding closure type is considered dependent, so that it will get properly instantiated. The second bit is a bit of a hack; to fix it properly, we may have to rearchitect our handling of default arguments, parsing them only after creating the function definition. However, I'd like to separate that work from the lambdas work. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151076 91177308-0d34-0410-b5e6-96231b3b80d8
13.cpp
|
999713eea940f4e087cc3ac878689c5c5c7a7225 |
18-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Rewrite variable capture within lambda expressions and blocks, eliminating a bunch of redundant code and properly modeling how the captures of outside blocks/lambdas affect the types seen by inner captures. This new scheme makes two passes over the capturing scope stack. The first pass goes up the stack (from innermost to outermost), assessing whether the capture looks feasible and stopping when it either hits the scope where the variable is declared or when it finds an existing capture. The second pass then walks down the stack (from outermost to innermost), capturing the variable at each step and updating the captured type and the type that an expression referring to that captured variable would see. It also checks type-specific restrictions, such as the inability to capture an array within a block. Note that only the first odr-use of each variable needs to do the full walk; subsequent uses will find the capture immediately, so multiple walks need not occur. The same routine that builds the captures can also compute the type of the captures without signaling errors and without actually performing the capture. This functionality is used to determine the type of declaration references as well as implementing the weird decltype((x)) rule within lambda expressions. The capture code now explicitly takes sides in the debate over C++ core issue 1249, which concerns the type of captures within nested lambdas. We opt to use the more permissive, more useful definition implemented by GCC rather than the one implemented by EDG. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150875 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
16.cpp
18.cpp
|
68932845a432d2a1dbbc57a84fd85bbb37c90487 |
18-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Unify our computation of the type of a captured reference to a variable; it was previously duplicated, and one of the copies failed to account for outer non-mutable lambda captures. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150872 91177308-0d34-0410-b5e6-96231b3b80d8
16.cpp
18.cpp
|
bd64520ca4e4d4c531637d311f8ea384c912fce8 |
17-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Only add 'const' to the type of variables captured in a lambda when we're capturing it by value in a non-mutable lambda. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150791 91177308-0d34-0410-b5e6-96231b3b80d8
18.cpp
|
7bdc15252ca2415f149ad812f0e5184d758e6105 |
16-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Lambda closure types are always considered to be like "local" classes, even if they are not within a function scope. Teach template instantiation to treat them as such, and make sure that we have a local instantiation scope when instantiating default arguments and static data members. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150725 91177308-0d34-0410-b5e6-96231b3b80d8
emplates.cpp
|
f6e2e0291b8964ed41b4325e21dd90b86e791f10 |
16-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implicitly define a lambda's conversion functions (to function pointers and block pointers). We use dummy definitions to keep the invariant that an implicit, used definition has a body; IR generation will substitute the actual contents, since they can't be represented as C++. For the block pointer case, compute the copy-initialization needed to capture the lambda object in the block, which IR generation will need later. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150645 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
|
c2956e5681113bbcec5ff98833345166942a211b |
15-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Lambda closure types have a conversion function to a block pointer with the same parameter types and return type as the function call operator. This is the real answer to http://stackoverflow.com/questions/4148242/is-it-possible-to-convert-a-c0x-lambda-to-a-clang-block :) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150620 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
|
e4e68d45f89ff4899d30cbd196603d09b7fbc150 |
15-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
When overload resolution picks an implicitly-deleted special member function, provide a specialized diagnostic that indicates the kind of special member function (default constructor, copy assignment operator, etc.) and that it was implicitly deleted. Add a hook where we can provide more detailed information later. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150611 91177308-0d34-0410-b5e6-96231b3b80d8
19.cpp
|
87c5150752baafab380e5f7837a32410fa83c7dc |
15-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
A little more lambda capture initialization diagnostics cleanup git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150589 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
|
4773654f2700d6fbb20612fbb6763b35860fa74d |
15-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Introduce a new initialization entity for lambda captures, and specialize location information and diagnostics for this entity. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150588 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
|
793cd1c4cdfaafc52e2c2ad9dae959befe4bb166 |
15-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Specialize noreturn diagnostics for lambda expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150586 91177308-0d34-0410-b5e6-96231b3b80d8
5.cpp
7.cpp
emplates.cpp
|
4e88df72e690498aeba2dc3d5089388b27be66fa |
15-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Specialize the diagnostic complaining about conflicting types of return statements within a lambda; this diagnostic previously referred to blocks. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150584 91177308-0d34-0410-b5e6-96231b3b80d8
4.cpp
|
c6889e7ed16604c51994e1f11becf213fdc64eb3 |
14-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement C++ core issue 974, which permits default arguments for lambda expressions. Because these issue was pulled back from Ready status at the Kona meeting, we still emit an ExtWarn when using default arguments for lambda expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150519 91177308-0d34-0410-b5e6-96231b3b80d8
efault-arguments.cpp
5.cpp
|
53393f23d8b767f976427a6d45b310bf37dd91c4 |
14-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Check the return type of lambda expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150503 91177308-0d34-0410-b5e6-96231b3b80d8
4.cpp
4.mm
|
a73652465bcc4c0f6cb7d933ad84e002b527a643 |
14-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement support for lambda capture pack expansions, e.g., [&values...] { print(values...); } git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150497 91177308-0d34-0410-b5e6-96231b3b80d8
23.cpp
|
d764437c9ce6feae11a9fca35bbc4ebc004f69e0 |
14-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Simple test ensuring that we perform direct initialization when copy-capturing in lambdas git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150442 91177308-0d34-0410-b5e6-96231b3b80d8
21.cpp
|
d5387e86ce3dfe1ae09e050ee11d86ca0d066d04 |
14-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Link together the call operator produced from transforming a lambda expression with the original call operator, so that we don't try to separately instantiate the call operator. Test and tweak a few more bits for template instantiation of lambda expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150440 91177308-0d34-0410-b5e6-96231b3b80d8
emplates.cpp
|
dfca6f53ab97d28d43e3fa2564209df08f3d282c |
13-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Introduce support for template instantiation of lambda expressions. This is mostly a simple refact, splitting the main "start a lambda expression" function into smaller chunks that are driven either from the parser (Sema::ActOnLambdaExpr) or during AST transformation (TreeTransform::TransformLambdaExpr). A few minor interesting points: - Added new entry points for TreeTransform, so that we can explicitly establish the link between the lambda closure type in the template and the lambda closure type in the instantiation. - Added a bit into LambdaExpr specifying whether it had an explicit result type or not. We should have had this anyway. This code is 'lightly' tested. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150417 91177308-0d34-0410-b5e6-96231b3b80d8
emplates.cpp
|
f8af98286022f72157d84951b48fde5fb369ab29 |
12-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Within the body of a lambda expression, decltype((x)) for an id-expression 'x' will compute the type based on the assumption that 'x' will be captured, even if it isn't captured, per C++11 [expr.prim.lambda]p18. There are two related refactors that go into implementing this: 1) Split out the check that determines whether we should capture a particular variable reference, along with the computation of the type of the field, from the actual act of capturing the variable. 2) Always compute the result of decltype() within Sema, rather than AST, because the decltype() computation is now context-sensitive. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150347 91177308-0d34-0410-b5e6-96231b3b80d8
12.cpp
18.cpp
|
215e4e17d00e12c38687a95502506d8f2ca3e646 |
12-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Lambdas have a deleted default constructor and a deleted copy assignment operator, per C++ [expr.prim.lambda]p19. Make it so. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150345 91177308-0d34-0410-b5e6-96231b3b80d8
19.cpp
20.cpp
5.cpp
7.cpp
|
668165ab1e604b063c0aa0df8ff91c80879670bf |
11-Feb-2012 |
Eli Friedman <eli.friedman@gmail.com> |
Make sure Sema creates a field for 'this' captures. (Doug, please double-check that this is correct.) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150292 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
|
8e9314fd846936ce04b92b2b72c6aba2cffab916 |
11-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Add simple semantic test for C++11 [expr.prim.lambda]p16, which covers recursive capture. This is far more interesting for IRgen. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150283 91177308-0d34-0410-b5e6-96231b3b80d8
16.cpp
|
f0459f87aaf05e76ce0d8c8c1e4c68e3c22195b7 |
11-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement C++11 [expr.lambda.prim]p13, which prohibits lambdas in default arguments if in fact those lambdas capture any entity. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150282 91177308-0d34-0410-b5e6-96231b3b80d8
13.cpp
|
3ac109cd17151bb8ad3a40b0cbb0e1923cd6c4a0 |
10-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Allow implicit capture of 'this' in a lambda even when the capture default is '=', and reword the warning about explicitly capturing 'this' in such lambdas to indicate that only explicit capture is banned. Introduce Fix-Its for this and other "save the programmer from themself" rules regarding what can be explicitly captured and what must be implicitly captured. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150256 91177308-0d34-0410-b5e6-96231b3b80d8
8.cpp
|
67b2c554dc12f589471713b7b01e9c94257ae593 |
10-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Add test from [expr.prim.lambda]p12, which deals with odr-use and nested captures. We currently don't get odr-use correct in array bounds, so that bit is commented out while we sort out what we need to do. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150255 91177308-0d34-0410-b5e6-96231b3b80d8
12.cpp
|
b555971345750350c21d541afe135054c7402933 |
10-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Don't introduce a lambda's operator() into the class until after we have finished parsing the body, so that name lookup will never find anything within the closure type. Then, add this operator() and the conversion function (if available) before completing the class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150252 91177308-0d34-0410-b5e6-96231b3b80d8
7.cpp
|
93e2fa488740a68604a4069ac61eba398de7275d |
10-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Add a lambda example from the working draft. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150239 91177308-0d34-0410-b5e6-96231b3b80d8
8.cpp
|
73d90928c0462daf0665fd7f8e44ca00d896540d |
10-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Add various tests for captures and the reaching scope of the lambda expression. Implement C++11 [expr.prim.lambda]p12's requirement that capturing a variable will odr-use it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150237 91177308-0d34-0410-b5e6-96231b3b80d8
10.cpp
11.cpp
12.cpp
|
ef7d78bd5be466c369b04af742ed8268244d4fe7 |
10-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement the conversion to a function pointer for lambda expressions, per C++ [expr.prim.lambda]p6. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150236 91177308-0d34-0410-b5e6-96231b3b80d8
5.cpp
6.cpp
|
a0c2b21e0d84ad289781e08e14148da6b8b8b76d |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Don't allow deduction of a lambda result type from an initializer list; it is not an expression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150194 91177308-0d34-0410-b5e6-96231b3b80d8
4.cpp
|
8d9bd653fc99e91ac79dbeb7cfa2abf18eda4d04 |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Tests for C++ [expr.prim.lambda]p5. We already implement all of these semantics. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150190 91177308-0d34-0410-b5e6-96231b3b80d8
5.cpp
|
54042f1bd78f1f1ea86be7d4af541462e127d2ed |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement return type deduction for lambdas per C++11 [expr.prim.lambda]p4, including the current suggested resolution of core isue 975, which allows multiple return statements so long as the types match. ExtWarn when user code is actually making use of this extension. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150168 91177308-0d34-0410-b5e6-96231b3b80d8
4.cpp
|
b326ca8ffbea96f9cc8a457b0f57be880304a6f5 |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Remove the "unsupported" error for lambda expressions. It's annoying, and rapidly becoming untrue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150165 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
10.cpp
14.cpp
15.cpp
2.cpp
3.cpp
5.cpp
7.cpp
8.cpp
|
7e545d95bc92157f9f124d95aa2ed66d691d2028 |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Add a test for the non-aggregaticity of lambda types per C++11 [expr.prim.lambda]. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150164 91177308-0d34-0410-b5e6-96231b3b80d8
3.cpp
|
e2c5913c48f66bfec9e58a8ad1d90e5eeffad586 |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement C++ [expr.prim.lambda]p2, which bans lambda expressions in unevaluated operands. Be certain that we're marking everything referenced within a capture initializer as odr-used. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150163 91177308-0d34-0410-b5e6-96231b3b80d8
2.cpp
|
18fe084d72392a5ceaa1fab7d3f3f0d0f2538069 |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Implement capture-by-copy for arrays in lambdas. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150138 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
15.cpp
|
20f87a4cd91b8d76571dc96aece916ac0bdf8b9f |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
When we create a non-static data member in the closure object for a capture, make sure we actually add the field. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150135 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
|
503384f731b5abcbf870b0a5224eb920e631db0a |
09-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Various interrelated cleanups for lambdas: - Complete the lambda class when we finish the lambda expression (previously, it was left in the "being completed" state) - Actually return the LambdaExpr object and bind to the resulting temporary when needed. - Detect when cleanups are needed while capturing a variable into a lambda (e.g., due to default arguments in the copy constructor), and make sure those cleanups apply for the whole of the lambda expression. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150123 91177308-0d34-0410-b5e6-96231b3b80d8
10.cpp
14.cpp
15.cpp
5.cpp
7.cpp
8.cpp
|
6d2f0f589a8c38f64147e90ccdd813dde74ecdb6 |
08-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Minor comment fix git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150090 91177308-0d34-0410-b5e6-96231b3b80d8
7.cpp
|
1e3767ac5449db6a1ede192d5e4217e34fa61f26 |
08-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
When computing the type of a local variable reference within a lambda, only add 'const' for variables captured by copy in potentially evaluated expressions of non-mutable lambdas. (The "by copy" part was missing). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150088 91177308-0d34-0410-b5e6-96231b3b80d8
7.cpp
|
76e3da57b0e8cf72d221f44d54566ef206341668 |
08-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
When completing a lambda expression, make sure to check and attach the body of the lambda to the function call operator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150087 91177308-0d34-0410-b5e6-96231b3b80d8
15.cpp
7.cpp
|
01d08018b7cf5ce1601707cfd7a84d22015fc04e |
07-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Introduce basic ASTs for lambda expressions. This covers: - Capturing variables by-reference and by-copy within a lambda - The representation of lambda captures - The creation of the non-static data members in the lambda class that store the captured variables - The initialization of the non-static data members from the captured variables - Pretty-printing lambda expressions There are a number of FIXMEs, both explicit and implied, including: - Creating a field for a capture of 'this' - Improved diagnostics for initialization failures when capturing variables by copy - Dealing with temporaries created during said initialization - Template instantiation - AST (de-)serialization - Binding and returning the lambda expression; turning it into a proper temporary - Lots and lots of semantic constraints - Parameter pack captures git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149977 91177308-0d34-0410-b5e6-96231b3b80d8
14.cpp
15.cpp
|
b942cb24a060435b18fef5b43eb33d77afc0d03a |
03-Feb-2012 |
Eli Friedman <eli.friedman@gmail.com> |
Implement implicit capture for lambda expressions. Still left: explicit captures in lambdas need to cause implicit capture, and I need to take a look at the diagnostics for some cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149718 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
|
b710dfe5231b0cd44dd987b9bd33c7f6ac165807 |
01-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Diagnose the restriction on default arguments in C++11 [expr.prim.lambda]p5. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149517 91177308-0d34-0410-b5e6-96231b3b80d8
5.cpp
|
93962e5360a43200faa70939571afc4fb9326cf7 |
01-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Improve checking of explicit captures in a C++11 lambda expression: - Actually building the var -> capture mapping properly (there was an off-by-one error) - Keeping track of the source location of each capture - Minor QoI improvements, e.g, highlighing the prior capture if there are multiple captures, pointing at the variable declaration we found if we reject it. As part of this, add standard citations for the various semantic checks we perform, and note where we're not performing those checks as we should. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149462 91177308-0d34-0410-b5e6-96231b3b80d8
10.cpp
8.cpp
|
fe9b559f81535ade84d24c42569378f80df47847 |
01-Feb-2012 |
Douglas Gregor <dgregor@apple.com> |
Diagnose attempts to explicitly capture a __block variable in a lambda. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149458 91177308-0d34-0410-b5e6-96231b3b80d8
locks.cpp
|