r276514 - [cxx1z-constexpr-lambda] Make a lambda's closure type eligible as a literal-type in C++1z

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 17 18:03:29 PST 2017


On 22 July 2016 at 21:05, Faisal Vali via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: faisalv
> Date: Fri Jul 22 23:05:19 2016
> New Revision: 276514
>
> URL: http://llvm.org/viewvc/llvm-project?rev=276514&view=rev
> Log:
> [cxx1z-constexpr-lambda] Make a lambda's closure type eligible as a
> literal-type in C++1z
>
>
> Additionally, for pre-C++1z, instead of forbidding a lambda's closure type
> from being a literal type through circumlocutorily setting
> HasNonLiteralTypeFieldsOrBases falsely to true -- handle lambda's more
> directly in CXXRecordDecl::isLiteral().
>
> One additional small step towards implementing constexpr-lambdas.
>

I don't know if this problem started with this change, but we now accept
this invalid code in C++14 mode:

constexpr auto a = [] {};


> Thanks to Richard Smith for his review!
> https://reviews.llvm.org/D22662
>
>
> Modified:
>     cfe/trunk/include/clang/AST/DeclCXX.h
>     cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/AST/DeclCXX.h?rev=276514&r1=276513&r2=276514&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
> +++ cfe/trunk/include/clang/AST/DeclCXX.h Fri Jul 22 23:05:19 2016
> @@ -535,11 +535,10 @@ class CXXRecordDecl : public RecordDecl
>          MethodTyInfo(Info) {
>        IsLambda = true;
>
> -      // C++11 [expr.prim.lambda]p3:
> -      //   This class type is neither an aggregate nor a literal type.
> +      // C++1z [expr.prim.lambda]p4:
> +      //   This class type is not an aggregate type.
>        Aggregate = false;
>        PlainOldData = false;
> -      HasNonLiteralTypeFieldsOrBases = true;
>      }
>
>      /// \brief Whether this lambda is known to be dependent, even if its
> @@ -1338,11 +1337,15 @@ public:
>    ///
>    /// We resolve DR1361 by ignoring the second bullet. We resolve DR1452
> by
>    /// treating types with trivial default constructors as literal types.
> +  ///
> +  /// Only in C++1z and beyond, are lambdas literal types.
>    bool isLiteral() const {
>      return hasTrivialDestructor() &&
> -           (isAggregate() || hasConstexprNonCopyMoveConstructor() ||
> -            hasTrivialDefaultConstructor()) &&
> -           !hasNonLiteralTypeFieldsOrBases();
> +           (!isLambda() || getASTContext().getLangOpts().CPlusPlus1z) &&
> +           !hasNonLiteralTypeFieldsOrBases() &&
> +           (isAggregate() || isLambda() ||
> +            hasConstexprNonCopyMoveConstructor() ||
> +            hasTrivialDefaultConstructor());
>    }
>
>    /// \brief If this record is an instantiation of a member class,
>
> Modified: cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/cxx1z-constexpr-lambdas.cpp?rev=276514&r1=
> 276513&r2=276514&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx1z-constexpr-lambdas.cpp Fri Jul 22
> 23:05:19 2016
> @@ -1,8 +1,8 @@
>  // RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks %s
>  // RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks
> -fdelayed-template-parsing %s
> -// RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks
> -fms-extensions %s
> -// RUN: %clang_cc1 -std=c++1z -verify -fsyntax-only -fblocks
> -fdelayed-template-parsing -fms-extensions %s
> +// RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -fblocks %s
> -DCPP14_AND_EARLIER
>
> +#ifndef CPP14_AND_EARLIER
>  namespace test_constexpr_checking {
>
>  namespace ns1 {
> @@ -33,4 +33,16 @@ namespace ns3 {
>        L(3); //expected-note{{non-constexpr function}}
>  }
>
> -} // end ns test_constexpr_call
> \ No newline at end of file
> +} // end ns test_constexpr_call
> +
> +#endif
> +
> +namespace test_lambda_is_literal {
> +#ifdef CPP14_AND_EARLIER
> +//expected-error at +4{{not a literal type}}
> +//expected-note at +2{{not an aggregate and has no constexpr constructors}}
> +#endif
> +auto L = [] { };
> +constexpr int foo(decltype(L) l) { return 0; }
> +
> +}
> \ No newline at end of file
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170217/34fae6c6/attachment-0001.html>


More information about the cfe-commits mailing list