[PATCH] D11027: [CONCEPTS] Creating Diagnostics for ill-formed function concept declaration

Nathan Wilson nwilson20 at gmail.com
Fri Jul 10 08:51:42 PDT 2015


On Fri, Jul 10, 2015 at 10:46 AM, Nathan Wilson <nwilson20 at gmail.com> wrote:

> nwilson updated this revision to Diff 29446.
> nwilson added a comment.
>
> As suggested by Aaron, modify phrasing of err_invalid_constexpr_var_decl
>

Aaron - fyi, I fixed this comment I made in Phab, but I guess an updated
email wasn't sent. This is what it correctly says now:
As suggested by Aaron, modify phrasing of err_function_concept_not_defined


> Remove redundant comment for concept declaration being definition
>
>
> http://reviews.llvm.org/D11027
>
> Files:
>   include/clang/Basic/DiagnosticSemaKinds.td
>   lib/Sema/SemaDecl.cpp
>   test/SemaCXX/cxx-concept-declaration.cpp
>
> Index: test/SemaCXX/cxx-concept-declaration.cpp
> ===================================================================
> --- /dev/null
> +++ test/SemaCXX/cxx-concept-declaration.cpp
> @@ -0,0 +1,17 @@
> +// RUN:  %clang_cc1 -std=c++14 -fconcepts-ts -x c++ -verify %s
> +
> +namespace A {
> +  template<typename T> concept bool C1() { return true; }
> +
> +  template<typename T> concept bool C2 = true;
> +}
> +
> +template<typename T> concept bool D1(); // expected-error {{function
> concept declaration must be a definition}}
> +
> +struct B {
> +  template<typename T> concept bool D2() { return true; } //
> expected-error {{concept declarations may only appear in namespace scope}}
> +};
> +
> +struct C {
> +  template<typename T> static concept bool D3 = true; // expected-error
> {{concept declarations may only appear in namespace scope}}
> +};
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -4878,6 +4878,17 @@
>    if (getLangOpts().CPlusPlus)
>      CheckExtraCXXDefaultArguments(D);
>
> +  if (D.getDeclSpec().isConceptSpecified()) {
> +    // C++ Concepts TS [dcl.spec.concept]p1: The concept specifier shall
> be
> +    // applied only to the definition of a function template or variable
> +    // template, declared in namespace scope
> +    if (!DC->getRedeclContext()->isFileContext()) {
> +      Diag(D.getIdentifierLoc(),
> +           diag::err_concept_decls_may_only_appear_in_namespace_scope);
> +      return nullptr;
> +    }
> +  }
> +
>    NamedDecl *New;
>
>    bool AddToScope = true;
> @@ -7223,6 +7234,7 @@
>      bool isVirtual = D.getDeclSpec().isVirtualSpecified();
>      bool isExplicit = D.getDeclSpec().isExplicitSpecified();
>      bool isConstexpr = D.getDeclSpec().isConstexprSpecified();
> +    bool isConcept = D.getDeclSpec().isConceptSpecified();
>      isFriend = D.getDeclSpec().isFriendSpecified();
>      if (isFriend && !isInline && D.isFunctionDefinition()) {
>        // C++ [class.friend]p5
> @@ -7439,6 +7451,20 @@
>          Diag(D.getDeclSpec().getConstexprSpecLoc(),
> diag::err_constexpr_dtor);
>      }
>
> +    if (isConcept) {
> +      // C++ Concepts TS [dcl.spec.concept]p1: The concept specifier
> shall be
> +      // applied only to the definition of a function template...
> +      if (!D.isFunctionDefinition()) {
> +        Diag(D.getDeclSpec().getConceptSpecLoc(),
> +             diag::err_function_concept_not_defined);
> +        NewFD->setInvalidDecl();
> +      }
> +
> +      // C++ Concepts TS [dcl.spec.concept]p2: Every concept definition is
> +      // implicity defined to be a constexpr declaration (implicitly
> inline)
> +      NewFD->setImplicitlyInline();
> +    }
> +
>      // If __module_private__ was specified, mark the function accordingly.
>      if (D.getDeclSpec().isModulePrivateSpecified()) {
>        if (isFunctionTemplateSpecialization) {
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td
> +++ include/clang/Basic/DiagnosticSemaKinds.td
> @@ -1959,6 +1959,12 @@
>  def note_private_extern : Note<
>    "use __attribute__((visibility(\"hidden\"))) attribute instead">;
>
> +// C++ Concepts TS
> +def err_concept_decls_may_only_appear_in_namespace_scope : Error<
> +  "concept declarations may only appear in namespace scope">;
> +def err_function_concept_not_defined : Error<
> +  "function concept declaration must be a definition">;
> +
>  // C++11 char16_t/char32_t
>  def warn_cxx98_compat_unicode_type : Warning<
>    "'%0' type specifier is incompatible with C++98">,
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150710/88f3e412/attachment.html>


More information about the cfe-commits mailing list