### Summary

I use the `ansible.builtin.copy` module. Unfortunately, there is a combination of parameters where check mode prints `ok`, although when running in run mode, there is an actual change.

Unexpected malfunction is reproducible tested on `2.9.27`, `2.12.6` and `2.13.0`

### Issue Type

Bug Report

### Component Name

copy

### Ansible Version

```console
$ ansible --version
ansible 2.9.27
  config file = None
  configured module search path = ['/home/phoffmann/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/phoffmann/.local/share/virtualenvs/ansible-2.9-TCZdLugh/lib/python3.8/site-packages/ansible
  executable location = /home/phoffmann/.local/share/virtualenvs/ansible-2.9-TCZdLugh/bin/ansible
  python version = 3.8.12 (default, Apr  8 2022, 11:41:59) [GCC 9.4.0]

$ ansible --version
ansible [core 2.12.6]
  config file = None
  configured module search path = ['/home/phoffmann/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/phoffmann/.pyenv/versions/3.8.12/lib/python3.8/site-packages/ansible
  ansible collection location = /home/phoffmann/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/phoffmann/.pyenv/versions/3.8.12/bin/ansible
  python version = 3.8.12 (default, Apr  8 2022, 11:41:59) [GCC 9.4.0]
  jinja version = 3.1.2
  libyaml = True


$ ansible --version
ansible [core 2.13.0]
  config file = None
  configured module search path = ['/home/phoffmann/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/phoffmann/.local/share/virtualenvs/ansible-2.13-v8S06Uvz/lib/python3.8/site-packages/ansible
  ansible collection location = /home/phoffmann/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/phoffmann/.local/share/virtualenvs/ansible-2.13-v8S06Uvz/bin/ansible
  python version = 3.8.12 (default, Apr  8 2022, 11:41:59) [GCC 9.4.0]
  jinja version = 3.1.2
  libyaml = True
```


### Configuration

```console
$ ansible-config dump --only-changed -t all
```


### OS / Environment

Ubuntu 20.04

### Steps to Reproduce

```yaml
---
- hosts: localhost
  tasks:
    - name: create file
      file:
        path: /tmp/ansible_foo
        state: touch
        owner: '{{ ansible_env.USER }}'
        group: '{{ ansible_env.USER }}'
        mode: 0600

    - name: Copy file with permissions
      copy:
        src: /tmp/ansible_foo
        dest: /tmp/ansible_foo2
        mode: 0644
        remote_src: yes

    - name: create file
      file:
        path: /tmp/ansible_foo2
        owner: '{{ ansible_env.USER }}'
        group: '{{ ansible_env.USER }}'
        mode: 0600
```


### Expected Results

I expect task `Copy file with permissions` to print `changed` 

Expected Result:
```
TASK [Copy file with permissions] ********************************************************************************************************************
--- before
+++ after
@@ -1,4 +1,4 @@
 {
-    "mode": "0600",
+    "mode": "0644",
     "path": "/tmp/ansible_foo2"
 }

```
It prints the expected `changed` as soon as `remote_src: yes` is removed.



### Actual Results

```console
TASK [Copy file with permissions] ********************************************************************************************************************
ok: [localhost]
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
description:
    - When used instead of C(src), sets the contents of a file directly to the specified value.
    - Works only when C(dest) is a file. Creates the file if it does not exist.
    - For advanced formatting or if C(content) contains a variable, use the
      M(ansible.builtin.template) module.
    type: str
    version_added: '1.1'
  dest:
    description:
    - Remote absolute path where the file should be copied to.
    - If C(src) is a directory, this must be a directory too.
    - If C(dest) is a non-existent path and if either C(dest) ends with "/" or C(src) is a directory, C(dest) is created.
    - If I(dest) is a relative path, the starting directory is determined by the remote host.
    - If C(src) and C(dest) are files, the parent directory of C(dest) is not created and the task fails if it does not already exist.
    type: path
    required: yes
  backup:
    description:
    - Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it incorrectly.
    type: bool
    default: no
    version_added: '0.7'
  force:
    description:
    - Influence whether the remote file must always be replaced.
    - If C(true), the remote file will be replaced when contents are different than the source.
    - If C(false), the file will only be transferred if the destination does not exist.
    type: bool
    default: yes
    version_added: '1.1'