https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116673

--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Something like this:

--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -13396,11 +13396,20 @@ finish_builtin_launder (location_t loc, tree arg,
tsubst_flags_t complain)
     arg = decay_conversion (arg, complain);
   if (error_operand_p (arg))
     return error_mark_node;
-  if (!type_dependent_expression_p (arg)
-      && !TYPE_PTR_P (TREE_TYPE (arg)))
+  if (!type_dependent_expression_p (arg))
     {
-      error_at (loc, "non-pointer argument to %<__builtin_launder%>");
-      return error_mark_node;
+      tree type = TREE_TYPE (arg);
+      if (!TYPE_PTR_P (type))
+       {
+         error_at (loc, "non-pointer argument to %<__builtin_launder%>");
+         return error_mark_node;
+       }
+      else if (!object_type_p (TREE_TYPE (type)))
+       {
+         // std::launder is ill-formed for function and cv void pointers.
+         error_at (loc, "invalid argument to %<__builtin_launder%>");
+         return error_mark_node;
+       }
     }
   if (processing_template_decl)
     arg = orig_arg;

Reply via email to