PR c++/83714 - ICE checking return in template.
authorJason Merrill <jason@redhat.com>
Tue, 16 Jan 2018 23:05:39 +0000 (18:05 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 16 Jan 2018 23:05:39 +0000 (18:05 -0500)
* typeck.c (check_return_expr): Call build_non_dependent_expr.

From-SVN: r256765

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/alias-decl-61.C [new file with mode: 0644]

index a0119e14640180d0a9dd401b3ca9da20f45bed43..d378cb2ff3fb144252624990f360cd303b6442eb 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/83714 - ICE checking return in template.
+       * typeck.c (check_return_expr): Call build_non_dependent_expr.
+
 2018-01-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/83817
index f0dc03de11120cea3f44fbf172550dba11e397d0..d0adb798278431b1e65b7f813d129d7532bebd79 100644 (file)
@@ -9333,6 +9333,9 @@ check_return_expr (tree retval, bool *no_warning)
         to undo it so we can try to treat it as an rvalue below.  */
       retval = maybe_undo_parenthesized_ref (retval);
 
+      if (processing_template_decl)
+       retval = build_non_dependent_expr (retval);
+
       /* Under C++11 [12.8/32 class.copy], a returned lvalue is sometimes
         treated as an rvalue for the purposes of overload resolution to
         favor move constructors over copy constructors.
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-61.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-61.C
new file mode 100644 (file)
index 0000000..670d91a
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/83714
+// { dg-do compile { target c++11 } }
+
+class a {
+  typedef int b;
+  operator b();
+};
+struct c {
+  using d = a;
+};
+using e = c;
+
+template <class T>
+e f(T) {
+  return e::d {};              // { dg-error "could not convert" }
+}