/* Register cleanups for parameters with trivial_abi attribute, the cleanup
of which is the callee's responsibility. */
- for (tree parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
- {
- if (TREE_CODE (parm) == PARM_DECL)
- {
- tree parm_type = TREE_TYPE (parm);
- if (has_trivial_abi_attribute (parm_type))
- {
- tree cleanup
- = cxx_maybe_build_cleanup (parm, tf_warning_or_error);
- if (cleanup && cleanup != error_mark_node)
- finish_decl_cleanup (parm, cleanup);
- }
- }
- }
+ if (!processing_template_decl)
+ for (tree parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
+ {
+ if (TREE_CODE (parm) == PARM_DECL)
+ {
+ tree parm_type = TREE_TYPE (parm);
+ if (has_trivial_abi_attribute (parm_type))
+ {
+ tree cleanup
+ = cxx_maybe_build_cleanup (parm, tf_warning_or_error);
+ if (cleanup && cleanup != error_mark_node)
+ finish_decl_cleanup (parm, cleanup);
+ }
+ }
+ }
if (use_eh_spec_block (current_function_decl))
current_eh_spec_block = begin_eh_spec_block ();
--- /dev/null
+// PR c++/125022
+// { dg-do compile { target c++11 } }
+
+struct raw_ptr {
+ raw_ptr(int *);
+};
+struct [[clang::trivial_abi]] scoped_refptr {
+ ~scoped_refptr();
+ template <typename...> void emplace(scoped_refptr) {}
+} main_thread_, AsyncMemoryConsumerRegistration_main_task_runner;
+struct AsyncMemoryConsumerRegistration {
+ AsyncMemoryConsumerRegistration();
+ raw_ptr consumer_;
+};
+int AsyncMemoryConsumerRegistration_consumer;
+AsyncMemoryConsumerRegistration::AsyncMemoryConsumerRegistration()
+ : consumer_(&AsyncMemoryConsumerRegistration_consumer) {
+ main_thread_.emplace(AsyncMemoryConsumerRegistration_main_task_runner);
+}