== Why is this an issue?

It is implementation-defined behaviour whether the reference parameter is a temporary object or a reference to the parameter. If the implementation uses a local copy (temporary object), this will be destroyed when the function returns. Any attempt to use such an object after its destruction will lead to undefined behaviour.


=== Noncompliant code example

[source,cpp]
----
int32_t * fn1 ( int32_t & x )
{
  return &x ; // Noncompliant
}
const int32_t * fn3 ( const int32_t & x )
{
  return &x ; // Noncompliant
}
int32_t & fn4 ( int32_t & x )
{
  return x ; // Noncompliant
}
const int32_t & fn5 ( const int32_t & x )
{
  return x ; // Noncompliant
}
----


== Resources

* MISRA {cpp}:2008, 7-5-3


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

The returned value is a [pointer||reference] to a parameter that is passed by reference.


'''
== Comments And Links
(visible only on this page)

=== relates to: S946

=== on 16 Oct 2014, 14:37:12 Ann Campbell wrote:
\[~samuel.mercier] 

* need a See section
* I think you missed the mark on the message. The title makes clear that the param being returned was initially received as a reference, so advice to refactor to a reference param doesn't make a lot of sense to me. Instead, I'd advise switching to a ``++void++`` return.

endif::env-github,rspecator-view[]
