From c059e0ac05e9795b065bbbe18159f52fdf1f7086 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sun, 6 Oct 2019 18:40:59 +0000 Subject: [PATCH] [Sema] Avoids an assertion failure when an invalid conversion declaration is used Summary: When using a user-defined conversion function template with a deduced return type the compiler gives a set of warnings: ``` bug.cc:252:44: error: cannot specify any part of a return type in the declaration of a conversion function; use an alias template to declare a conversion to 'auto (Ts &&...) const' template operator auto()(Ts &&... xs) const; ^~~~~~~~~~~~~~~~~~~ bug.cc:252:29: error: conversion function cannot convert to a function type template operator auto()(Ts &&... xs) const; ^ error: pointer to function type cannot have 'const' qualifier ``` after which it triggers an assertion failure. It seems the last error is incorrect and doesn't have any location information. This patch stops the compilation after the second warning. Fixes bug 31422. Patch by Mark de Wever! Reviewers: rsmith Reviewed By: rsmith Subscribers: bbannier, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64820 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@373862 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 3 +++ test/SemaCXX/PR31422.cpp | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 test/SemaCXX/PR31422.cpp diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 7a169ba51a..6114eb8e8d 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -8206,6 +8206,9 @@ static FunctionDecl *CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, } SemaRef.CheckConversionDeclarator(D, R, SC); + if (D.isInvalidType()) + return nullptr; + IsVirtualOkay = true; return CXXConversionDecl::Create( SemaRef.Context, cast(DC), D.getBeginLoc(), NameInfo, R, diff --git a/test/SemaCXX/PR31422.cpp b/test/SemaCXX/PR31422.cpp new file mode 100644 index 0000000000..0ac321d7af --- /dev/null +++ b/test/SemaCXX/PR31422.cpp @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s + +// expected-error@+3 {{cannot specify any part of a return type in the declaration of a conversion function; use an alias template to declare a conversion to 'auto (Ts &&...) const'}} +// expected-error@+2 {{conversion function cannot convert to a function type}} +struct S { + template operator auto()(Ts &&... xs) const; +}; -- 2.40.0