[PATCH] D11027: [CONCEPTS] Creating Diagnostics for ill-formed function concept declaration
Nathan Wilson
nwilson20 at gmail.com
Thu Jul 9 04:45:21 PDT 2015
nwilson updated this revision to Diff 29315.
nwilson added a comment.
Addressing comments -
Changing diagnostic name and update wording.
Move check for concept scope being in namespace scope to HandleDeclarator.
Update comment's wording
Remove some unnecessary tests.
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,7 @@
+// RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ -verify %s
+
+template<typename T> concept bool D1(); // expected-error {{can only declare a function concept with its definition}}
+
+struct A {
+ template<typename T> concept bool D1() { return true; } // expected-error {{function and variable concept declarations may only appear in global 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_global_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,19 @@
Diag(D.getDeclSpec().getConstexprSpecLoc(), diag::err_constexpr_dtor);
}
+ if (isConcept) {
+ // We are checking that the function concept declaration is a definition
+ 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_global_scope : Error<
+ "function and variable concept declarations may only appear in global scope">;
+def err_function_concept_not_defined : Error<
+ "can only declare a function concept with its definition">;
+
// C++11 char16_t/char32_t
def warn_cxx98_compat_unicode_type : Warning<
"'%0' type specifier is incompatible with C++98">,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11027.29315.patch
Type: text/x-patch
Size: 3217 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150709/17227c50/attachment.bin>
More information about the cfe-commits
mailing list