Mordante created this revision.
Mordante added a reviewer: rsmith.
Mordante added a project: clang.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D64820

Files:
  clang/lib/Sema/SemaDecl.cpp
  clang/test/Sema/conversion_function_to_function.cpp


Index: clang/test/Sema/conversion_function_to_function.cpp
===================================================================
--- /dev/null
+++ clang/test/Sema/conversion_function_to_function.cpp
@@ -0,0 +1,9 @@
+// RUN: not %clang_cc1 -fsyntax-only -std=c++14 %s 2>&1 | FileCheck %s
+
+struct S {
+  template <typename... Ts> operator auto()(Ts &&... xs) const;
+};
+
+// CHECK: 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'
+// CHECK: error: conversion function cannot convert to a function type
+// CHECK-NOT: Assertion{{.*}}failed
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -8066,6 +8066,9 @@
     }
 
     SemaRef.CheckConversionDeclarator(D, R, SC);
+    if (D.isInvalidType())
+      return nullptr;
+
     IsVirtualOkay = true;
     return CXXConversionDecl::Create(
         SemaRef.Context, cast<CXXRecordDecl>(DC), D.getBeginLoc(), NameInfo, R,


Index: clang/test/Sema/conversion_function_to_function.cpp
===================================================================
--- /dev/null
+++ clang/test/Sema/conversion_function_to_function.cpp
@@ -0,0 +1,9 @@
+// RUN: not %clang_cc1 -fsyntax-only -std=c++14 %s 2>&1 | FileCheck %s
+
+struct S {
+  template <typename... Ts> operator auto()(Ts &&... xs) const;
+};
+
+// CHECK: 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'
+// CHECK: error: conversion function cannot convert to a function type
+// CHECK-NOT: Assertion{{.*}}failed
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -8066,6 +8066,9 @@
     }
 
     SemaRef.CheckConversionDeclarator(D, R, SC);
+    if (D.isInvalidType())
+      return nullptr;
+
     IsVirtualOkay = true;
     return CXXConversionDecl::Create(
         SemaRef.Context, cast<CXXRecordDecl>(DC), D.getBeginLoc(), NameInfo, R,
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to