[PATCH] D11600: Add concept to VarDecl and diagnostic for unitialized variable concept
Aaron Ballman
aaron.ballman at gmail.com
Fri Jul 31 13:41:45 PDT 2015
On Wed, Jul 29, 2015 at 1:39 PM, Nathan Wilson <nwilson20 at gmail.com> wrote:
> nwilson created this revision.
> nwilson added reviewers: rsmith, fraggamuffin, hubert.reinterpretcast, faisalv, aaron.ballman.
> nwilson added a subscriber: cfe-commits.
> Herald added a subscriber: aemerson.
>
> Add IsConcept bit to VarDecl::NonParmVarDeclBitfields and associated isConcept/setConcept member functions. Set IsConcept to true when 'concept' specifier is in variable declaration. Create diagnostic when variable concept is not initialized.
LGTM!
~Aaron
>
> http://reviews.llvm.org/D11600
>
> Files:
> include/clang/AST/Decl.h
> include/clang/Basic/DiagnosticSemaKinds.td
> lib/Sema/SemaDecl.cpp
> test/SemaCXX/cxx-concept-declaration.cpp
>
> Index: test/SemaCXX/cxx-concept-declaration.cpp
> ===================================================================
> --- test/SemaCXX/cxx-concept-declaration.cpp
> +++ test/SemaCXX/cxx-concept-declaration.cpp
> @@ -15,3 +15,6 @@
> struct C {
> template<typename T> static concept bool D3 = true; // expected-error {{concept declarations may only appear in namespace scope}}
> };
> +
> +template<typename T>
> +concept bool D6; // expected-error {{variable concept declaration must be initialized}}
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -5849,6 +5849,9 @@
>
> if (D.getDeclSpec().isConstexprSpecified())
> NewVD->setConstexpr(true);
> +
> + if (D.getDeclSpec().isConceptSpecified())
> + NewVD->setConcept(true);
> }
>
> // Set the lexical context. If the declarator has a C++ scope specifier, the
> @@ -9407,6 +9410,16 @@
> return;
> }
>
> + // C++ Concepts TS [dcl.spec.concept]p1: [...] A variable template
> + // definition having the concept specifier is called a variable concept. A
> + // concept definition refers to [...] a variable concept and its initializer.
> + if (Var->isConcept()) {
> + Diag(Var->getLocation(),
> + diag::err_var_concept_not_initialized);
> + Var->setInvalidDecl();
> + return;
> + }
> +
> // OpenCL v1.1 s6.5.3: variables declared in the constant address space must
> // be initialized.
> if (!Var->isInvalidDecl() &&
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td
> +++ include/clang/Basic/DiagnosticSemaKinds.td
> @@ -1970,6 +1970,8 @@
> "concept declarations may only appear in namespace scope">;
> def err_function_concept_not_defined : Error<
> "function concept declaration must be a definition">;
> +def err_var_concept_not_initialized : Error<
> + "variable concept declaration must be initialized">;
>
> // C++11 char16_t/char32_t
> def warn_cxx98_compat_unicode_type : Warning<
> Index: include/clang/AST/Decl.h
> ===================================================================
> --- include/clang/AST/Decl.h
> +++ include/clang/AST/Decl.h
> @@ -815,6 +815,9 @@
> /// \brief Whether this variable is (C++0x) constexpr.
> unsigned IsConstexpr : 1;
>
> + /// \brief Whether this variable is (C++ Concepts TS) concept.
> + unsigned IsConcept : 1;
> +
> /// \brief Whether this variable is the implicit variable for a lambda
> /// init-capture.
> unsigned IsInitCapture : 1;
> @@ -1238,6 +1241,15 @@
> NonParmVarDeclBits.IsConstexpr = IC;
> }
>
> + /// Whether this variable is (C++ Concepts TS) concept.
> + bool isConcept() const {
> + return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsConcept;
> + }
> + void setConcept(bool IC) {
> + assert(!isa<ParmVarDecl>(this));
> + NonParmVarDeclBits.IsConcept = IC;
> + }
> +
> /// Whether this variable is the implicit variable for a lambda init-capture.
> bool isInitCapture() const {
> return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInitCapture;
>
>
More information about the cfe-commits
mailing list