]> granicus.if.org Git - clang/commitdiff
[Sema] Avoids an assertion failure when an invalid conversion declaration is used
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 6 Oct 2019 18:40:59 +0000 (18:40 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 6 Oct 2019 18:40:59 +0000 (18:40 +0000)
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 <typename... Ts> operator auto()(Ts &&... xs) const;
                                           ^~~~~~~~~~~~~~~~~~~
bug.cc:252:29: error: conversion function cannot convert to a function type
  template <typename... Ts> 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
test/SemaCXX/PR31422.cpp [new file with mode: 0644]

index 7a169ba51aa914c7cf335c7d692d794aa131ea8f..6114eb8e8d6e9ae2f02691bbed61f4145e94fd13 100644 (file)
@@ -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<CXXRecordDecl>(DC), D.getBeginLoc(), NameInfo, R,
diff --git a/test/SemaCXX/PR31422.cpp b/test/SemaCXX/PR31422.cpp
new file mode 100644 (file)
index 0000000..0ac321d
--- /dev/null
@@ -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 <typename... Ts> operator auto()(Ts &&... xs) const;
+};