rsmith added inline comments.

================
Comment at: lib/Sema/SemaDecl.cpp:5902-5915
@@ -5901,1 +5901,16 @@
+
+      // C++ Concepts TS [dcl.spec.concept]p7: A program shall not declare 
[...]
+      //  an explicit specialization, or a partial specialization of a concept
+      // definition
+      if (IsVariableTemplateSpecialization && !IsPartialSpecialization) {
+        Diag(NewVD->getLocation(), diag::err_concept_decl_specialized)
+          << 0 << 1;
+        NewVD->setInvalidDecl(true);
+      }
+
+      if (IsVariableTemplateSpecialization && IsPartialSpecialization) {
+        Diag(NewVD->getLocation(), diag::err_concept_decl_specialized)
+          << 0 << 2;
+        NewVD->setInvalidDecl(true);
+      }
     }
----------------
Maybe combine these into a single check, and use `<< (IsPartialSpecialization ? 
2 : 1)` for the specialization kind.

================
Comment at: lib/Sema/SemaDecl.cpp:7562
@@ -7546,1 +7561,3 @@
     if (isConcept) {
+      // This is a function concept
+      NewFD->setConcept(true);
----------------
Missing period.

================
Comment at: lib/Sema/SemaDecl.cpp:7888
@@ -7863,1 +7887,3 @@
+
+      if (NewFD->isInvalidDecl() && !NewFD->isConcept()) {
         HasExplicitTemplateArgs = false;
----------------
I'm not convinced this is going to work: if the declaration is invalid because 
it's declared `concept` /and/ for another reason, we presumably want to use the 
same error recovery path as before.

================
Comment at: test/CXX/concepts-ts/dcl.dcl/dcl.spec/dcl.concept/p7.cpp:1
@@ +1,2 @@
+// RUN:  %clang_cc1 -std=c++14 -fconcepts-ts -x c++ -verify %s
+
----------------
This file is in the wrong directory; the relevant section is 
[dcl.spec.concept], not [dcl.concept].

================
Comment at: test/CXX/concepts-ts/dcl.dcl/dcl.spec/dcl.concept/p7.cpp:4
@@ +3,3 @@
+template<typename T> concept bool VCEI { true };
+template concept bool VCEI<int>; // expected-error {{variable concept cannot 
be explicitly instantiated}}
+
----------------
hubert.reinterpretcast wrote:
> This is not a declaration (never mind definition) of a function template or 
> variable template, but of a specialization. Presumably, this violates 
> [dcl.spec.concept]p1. Perhaps a test for p7 should omit the concept 
> specifier? The same logic may apply to the explicit specialization cases.
Right, there are two different ways things can go wrong here:

1) `concept` is specified on a non-template (such as in an explicit 
specialization or explicit instantiation declaration) or a variable template 
partial specialization
2) an explicit or partial specialization or an explicit instantiation declares 
(*without* the `concept` keyword) a specialization of a template that was 
declared as a concept.

This patch is only checking for the former case, whereas the rule in 
[dcl.spec.concept]p7 says that the latter case is ill-formed. So these tests 
are at least in the wrong file. To check for violations of p7, you'll need to 
look at whether the template's pattern is marked as being a concept.

I'm also not sure where we say that a partial specialization of a variable 
template cannot be declared `concept`; that seems to be a defect in the TS 
wording.


http://reviews.llvm.org/D13357



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to