<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/108655>108655</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang rejects the valid member function definition with typedefed retyrb type and global :: scope resolution operator
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          suikan4github
      </td>
    </tr>
</table>

<pre>
    ## Overview
Clang shows an error when a class member function definiton has both : 
- Typedefed return type. 
- Global :: scope resolutoin operator. 

This problem is not found with GCC.

## Code to demonstrate
In the following code, uint32_t is typedefed inside stdint.h. Copy this code into foo.cpp.
```cpp
#include <stdint.h>

class foo {
 public:
  uint32_t bar(unsigned int a);
  unsigned int baz(unsigned int a);
  uint32_t qux(uint32_t a);
};

// Fail to compile with Clang 18.1.3 x86_64-pc-linux-gnu
uint32_t ::foo::bar(unsigned int a) { return a; }

// No problem if not using typdef.
unsigned int ::foo::baz(unsigned int a) { return a; }

// No problem if not using global scope resolution operator.
uint32_t foo::qux(uint32_t a) { return a; }

int main() {
  foo my_foo;

  return (my_foo.bar(0));
}

```
To reproduce the problem, run the following command. 
```sh
takemasa@vm2204:~/git/sandbox$ clang-18 foo.cpp
foo.cpp:11:1: error: 'uint32_t' (aka 'unsigned int') is not a class, namespace, or enumeration
   11 | uint32_t ::foo::bar(unsigned int a) { return a; }
      | ^
1 error generated.

```
## Workaround
To avoid this problem, we should use non-typedefed return type in the function definiton. 

```cpp
unsigned int ::foo::baz(unsigned int a) { return a; }
```

Or, we should not to use the global :: scope operator in the function definition. 

```cpp
uint32_t foo::qux(uint32_t a) { return a; }

```
## Environment and version

- Ubuntu 22.04, 24.04
- Clang 18.1.8

```sh
takemasa@vm2204:~/git/sandbox$ clang-18 --version
Ubuntu clang version 18.1.8 (++20240731024944+3b5b5c1ec4a3-1~exp1~20240731145000.144)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk1zozgT_jXypcsUCDD44EPsjKfeyzuX2drjlEANaCMkVh9OvIf57Vviw7ETZ2drZ1IpLFCr9XQ_3Y_ErBWtQtyRfE_yxxXzrtNmZ714Yiprhet8tao0P-8ITQlN4csJzUngM4kfSfxwkEy1YDv9bIEpQGO0gecOFTCoJbMWeuwrNNB4VTuhFXBshBJOK-iYhUq7Dkj6AJO7NXw9D8ixQQ4GnTcK3HnA6DL9WeqKybAiLLK1HhAMWi2900KBHtAwp82yYHp-7YSFwehKYg_CgtIOGu0Vh2fhOvh8OETX5nOgB80RnAaOvVbWGeZwmv-fAtchNFpK_SxUC7XmSOgBvFAupd9c2MNd4hDKCo5gHRfKRV0EBz2cwQVMYSEI5TQ0Wkf1MCw4NvH0Xw_DBZNQtfQcgaSHxRdJP10DnxLeaA2k2E-fYPCVFHXI1_T-CrJihtDSq5H_ANMBI3RL0v3F9HquYn_9yHzx_Kd_CabL640ZKR5fx3NoR0KPcGRChnTXuh-ExImaqbySMkqiFF7KzbdNth7qtRTKv6xb5ScPl52msmi0ngYfRBiys1QXI-keAqb3gP6vX2umGWvG28C2Ow8cm5mpG-fvtr-bsZ_cvp064Kb0Q19dSv9NTi5w7rDyIygBcs-EIrScrReuQ5H152-j8xs2YfFHaDkZRBMNcaiCN4VwHfVS8nPLajA4GM19jWO3zbkIbWb8-wbse6b4pesXX7abPjj2hD2zjGTxqac0zkj68J3QYyscoUfLFK_0C6FZkCzVrpNy6cdp-fKSPiRJeATpGZVuFC5aLDkltAhhsyc2fr0intAiJHDWnlkaQyyK9WgHVo_6oQ2g8n3gUWi15BOSBEhxpS4_W-Uw_gWXJJ_1I5mVu0UVdkce_QM3sz7-rs0TM0FGL5SxkxZ8krYrvp4xHBBecvAWQWm1dvdEHsRM67uT4lbN34vjr23CN8GOzy_mNpDAotNjPAFye-dUWvrxo7DEv4jrV_TwffI-qZMwWvUY8qE4nNDYS80th-1vlVfOA6VRnIX4aRYG8-SVNJd39_vvzbde38CZYYzTC9B5YxiVaU_onsY0i4s0iWm2zTJC92mVV3mdYJ2xdJ18x5ch-b4YJVkex3GUBMPtXL3MtOgCfR8eM187g4xDrznKYDhoK16WK4F1TErkj2IWhaO3htBjJdTd5Kz4LuXbdMtWuEsKuqGbnJbZqtttyrjM6yJOcFsWRUZZmuZlVm1oFeebqilWYjdGsU1SSuMyziJaVbTJeFrklHMWNySLsWdCRlKe-kibdiWs9bhL4nKT5yvJKpR2vO5ROuaUUBpufmYXFqwr31qSxVJYZ19dOOEk7ibODf6BtbNjVZ-YFPyjO14Yjsf4Tb-fTTX1e6i7e51z51BbeSN3nXODDZbjATldTaNa94QeA875Zz0YHfARehzjtoQe59BPO_p3AAAA__9qmknv">