r224974 - Don't crash on an invalid trailing return type on a function before a '...'

Nico Weber nicolasweber at gmx.de
Mon Dec 29 18:06:40 PST 2014


Author: nico
Date: Mon Dec 29 20:06:40 2014
New Revision: 224974

URL: http://llvm.org/viewvc/llvm-project?rev=224974&view=rev
Log:
Don't crash on an invalid trailing return type on a function before a '...'

clang tries to produce a helpful diagnostic for the traiilng '...', but the
code that r216778 added for this doesn't expect an invalid trailing return type.
Add code to explicitly handle this.

Having explicit code for this but not for other things looks a bit strange, but
trailing return types are special in that they have a separate existence bit in
addition to the type (see r158348).

Modified:
    cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
    cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp?rev=224974&r1=224973&r2=224974&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp Mon Dec 29 20:06:40 2014
@@ -782,11 +782,11 @@ bool Sema::containsUnexpandedParameterPa
                  Chunk.Fun.NoexceptExpr->containsUnexpandedParameterPack())
         return true;
 
-      if (Chunk.Fun.hasTrailingReturnType() &&
-          Chunk.Fun.getTrailingReturnType()
-              .get()
-              ->containsUnexpandedParameterPack())
-        return true;
+      if (Chunk.Fun.hasTrailingReturnType()) {
+        QualType T = Chunk.Fun.getTrailingReturnType().get();
+	if (!T.isNull() && T->containsUnexpandedParameterPack())
+	  return true;
+      }
       break;
 
     case DeclaratorChunk::MemberPointer:

Modified: cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp?rev=224974&r1=224973&r2=224974&view=diff
==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp (original)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p13.cpp Mon Dec 29 20:06:40 2014
@@ -68,6 +68,10 @@ void ci(int ... []); // expected-error{{
 void di(int ... x[]); // expected-error{{type 'int []' of function parameter pack does not contain any unexpanded parameter packs}}
 }
 
+void f5a(auto fp(int)->unk ...) {} // expected-error{{unknown type name 'unk'}}
+void f5b(auto fp(int)->auto ...) {} // expected-error{{'auto' not allowed in function return type}}
+void f5c(auto fp()->...) {} // expected-error{{expected a type}}
+
 // FIXME: Expand for function and member pointer types.
 
 





More information about the cfe-commits mailing list