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

    <tr>
        <th>Summary</th>
        <td>
            Clang ignores preprocessor directives when modularized headers are mixed with nonmodularized headers
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:modules,
            miscompilation
      </td>
    </tr>

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

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

<pre>
    This was found when I was attempting to find a minimal reproduction for https://crbug.com/1430962. It is likely that these two bugs have the same or at least a similar root cause.

Repro steps:

I have commit 1cf5188c72902e85e85095d788f5dfa138c320f8 checked out.

All of these files are in the same directory.

```cpp
// nonmod.h
#ifndef NONMOD_H_
#define NONMOD_H_

int foo() {
#ifdef FOO_RET_1
 return 1;
#else
  return 0;
#endif
}

#endif  // NONMOD_H_
```

```cpp
// mod.h
#ifndef MOD_H_
#define MOD_H_

#include "nonmod.h"

#endif  // MOD_H_
```

```
// module.modulemap
module mod {
  export *
  header "mod.h"
}
```

```cpp
// translation_unit.cc
#define FOO_RET_1
#include "nonmod.h"
#include "mod.h"
```

Expected behavior:

When compiling `translation_unit.cc` with modules enabled, `foo()` should return 1.

Actual behavior:

`foo()` correctly returns 1 when compiled with `-fno-modules` but `foo()` incorrectly returns 0 when compiled with `-fmodules`:

```sh
# All commands are run in the same directory where the files are saved.

# With modules
$ ~/src/llvm-project/build-debug/bin/clang++ -c -S -emit-llvm -o - -fno-modules translation_unit.cc

# extra lines removed...

; Function Attrs: mustprogress noinline nounwind optnone uwtable
define dso_local noundef i32 @_Z3foov() #0 {
entry:
  ret i32 1
}

# ...

$ ~/src/llvm-project/build-debug/bin/clang++ -c -S -emit-llvm -o - -fmodules translation_unit.cc

# extra lines removed...

; Function Attrs: mustprogress noinline nounwind optnone uwtable
define dso_local noundef i32 @_Z3foov() #0 {
entry:
  ret i32 0
}

# ...
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkVk-P4rgT_TTmUgI5DoFw4EBPD_rN4TctzY400l6QY1eIdxw78h_onsN-9pWTAA30zPYe9rQSCnKVXX5-rnou7r3aG8Q1KR5I8TjhMTTWrbnm5kfDbTaprHxZf22UhyP3UNtoJBwbNPCpN_AQsO2CMnsIFmplJHBolVEt1-Cwc1ZGEZQ1UFsHTQidJ_mGsC1hW-GquJ8J2xK2zeY5XS3YDD4FUB60-o76BULDA4QGPUI4Wqji3kPDD5hs4HmLYB3wABq5D8DBq1Zp7sBZG0Dw6HFG6COhm-H7JeEBH3AA8crzaQgrbNuqAJmoi6wsxZKtKMOywLKgq0Iuy7IuZM2zvBQ5o3UJokHxHSXYGK422mgNth6R10qjB-4QlLkAl8qhCNa9XC0kCzr8RNeNlp4qMNa0Vs6akzFXtZFYw-enz_9_etz9b3d2SKyVwTtH_1UmQG0tYSVhKyDLh1fhUrTt09Puy8evu2ywg8MQnYGM5JeZqD2O7pOfXvmNVPU4Wj5eHW50AoyHusV4Ovy7GHmTjre5uCcirTBCR4lAGDuTy9gv8b4f7C3SqHE2_LV8PMYwTM7LRQDgc2ddAMI2J0uDXKJLMG8wnsn9R7QFx43XPJXkLhoVZkLc0nWTBX_H1ZX7xvcWtI_PHYqAEips-EFZd1OL35K6CNt2SidZIQv6FuYFhaMKzUiuBzS80igJ-5BWnJM8zfONjVqek_m6UkWIXP8Mym0kYV2qWv0yBvOQDWI4wEU5YCILOq2NnY7Y0soqhjtcytzHoz-Ndwl2D3L4-Us5QFKgpGbcyEF7XDRv60_a0A2KelEqzw8oZzfFAN9eEX6yzuFPwrbeCcK2Wh_aaefsHygCYdsqKi2nEqu4TyNlkuZrbvaEPRD2AFMB099giq0K07QUpham8Jq5X2TrGRQ-B8dBK4MeHLY2AZ9dQ88fYBvN8AxtQnBJ_aGNPnTO7h16D8Yqk0KAsdEc0ytmu2CsQYjHkBJriDQWiPR2p63gup-edEflDMic7n7Pa2sPJ31lOb3UNprgXs5X12tnvyz7mVbC7TH-Da7_Q0TTdxB9KqWJXOdyla_4BNfZoiyKkjE6nzTrmq1WWbWQMi-WNSuqqhJzivNVTZelWMlqotaMspwuaEazbDHPZ0JikfqFvBI1L-eczCm2XOlZuoaZdfuJ8j7iepHTeT7RvELt-26MseEC882p5Bgj7EMSWeUHgejvK5mLx4lb9ymReiQyp1r54C9bBBU0rj-keKD2xjr00PXtmUDvrRvlQB3QDwLUb8md-oFyfIEGYWjV80mVhpfgdtYkOr2-7vP2KjSxGhu9BOk-fXsKPGHbnoW_AgAA__-YRi6m">