[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    Re: [PATCH] D11789: Modify DeclaratorChuck::getFunction to be passed an Exception Specification Sour
From:       Richard Smith <richard () metafoo ! co ! uk>
Date:       2015-08-06 0:45:46
Message-ID: d1b0424968841eabedf54d46cfdeb4da () localhost ! localdomain
[Download RAW message or body]

rsmith added inline comments.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:1977
@@ -1976,1 +1976,3 @@
+def  err_function_concept_exception_spec : Error<
+  "function concept can not have exception specifiers">;
 
----------------
def  err -> def err
can not -> cannot
specifiers -> specification

================
Comment at: include/clang/Sema/DeclSpec.h:1330-1336
@@ -1325,5 +1329,9 @@
 
-    SourceLocation getExceptionSpecLoc() const {
-      return SourceLocation::getFromRawEncoding(ExceptionSpecLoc);
+    SourceLocation getExceptionSpecLocBeg() const {
+      return SourceLocation::getFromRawEncoding(ExceptionSpecLocBeg);
+    }
+
+    SourceLocation getExceptionSpecLocEnd() const {
+      return SourceLocation::getFromRawEncoding(ExceptionSpecLocEnd);
     }
 
----------------
Please add a `getExceptionSpecRange` function returning the `SourceRange`...

================
Comment at: lib/Sema/SemaDecl.cpp:7447-7450
@@ -7446,1 +7446,6 @@
 
+      if (const FunctionProtoType *FPT = R->getAs<FunctionProtoType>()) {
+        if (FPT->hasExceptionSpec()) {
+          auto LocBeg = D.getFunctionTypeInfo().getExceptionSpecLocBeg();
+          auto LocEnd = D.getFunctionTypeInfo().getExceptionSpecLocEnd();
+          Diag(LocBeg, diag::err_function_concept_exception_spec)
----------------
This will assert if there isn't a `FunctionTypeInfo` for the declaration, which can \
theoretically happen if it's declared via an (ill-formed today) `typedef`. (It also \
might not provide a source range if the exception specification is implicit, for \
instance because the function template is a destructor or deallocation function, but \
passing an empty SourceRange to the FixItHint should just result it in being \
ignored.)

================
Comment at: lib/Sema/SemaDecl.cpp:7449-7452
@@ +7448,6 @@
+        if (FPT->hasExceptionSpec()) {
+          auto LocBeg = D.getFunctionTypeInfo().getExceptionSpecLocBeg();
+          auto LocEnd = D.getFunctionTypeInfo().getExceptionSpecLocEnd();
+          Diag(LocBeg, diag::err_function_concept_exception_spec)
+            << FixItHint::CreateRemoval(SourceRange(LocBeg, LocEnd));
+          NewFD->setInvalidDecl();
----------------
... and use it here.

================
Comment at: lib/Sema/SemaDecl.cpp:7454-7455
@@ +7453,4 @@
+          NewFD->setInvalidDecl();
+        }
+        else {
+          NewFD->setType(Context.getFunctionType(
----------------
No newline before `else`.

================
Comment at: lib/Sema/SemaDecl.cpp:7456
@@ +7455,3 @@
+        else {
+          NewFD->setType(Context.getFunctionType(
+            FPT->getReturnType(), FPT->getParamTypes(),
----------------
rsmith wrote:
> Use `ASTContext::adjustExceptionSpec(NewFD, EST_BasicNoexcept)` for this.
Add a comment here indicating why we're doing this. Maybe a snippet of the relevant \
rule from the TS?

================
Comment at: lib/Sema/SemaDecl.cpp:7456-7458
@@ +7455,5 @@
+        else {
+          NewFD->setType(Context.getFunctionType(
+            FPT->getReturnType(), FPT->getParamTypes(),
+            FPT->getExtProtoInfo().withExceptionSpec(EST_BasicNoexcept)));
+        }
----------------
Use `ASTContext::adjustExceptionSpec(NewFD, EST_BasicNoexcept)` for this.

================
Comment at: lib/Sema/SemaDecl.cpp:7456-7458
@@ +7455,5 @@
+        else {
+          NewFD->setType(Context.getFunctionType(
+            FPT->getReturnType(), FPT->getParamTypes(),
+            FPT->getExtProtoInfo().withExceptionSpec(EST_BasicNoexcept)));
+        }
----------------
rsmith wrote:
> rsmith wrote:
> > Use `ASTContext::adjustExceptionSpec(NewFD, EST_BasicNoexcept)` for this.
> Add a comment here indicating why we're doing this. Maybe a snippet of the relevant \
> rule from the TS?
You don't seem to have test coverage for this part. Maybe test it with \
`static_assert(noexcept(SomeConcept<T>()));`?


http://reviews.llvm.org/D11789



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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic