
Preprocessing the preprocessor output again interacts poorly with some flag combinations when we perform a separate preprocessing stage. In our case, `-no-integrated-cpp -dD` triggered this issue; but I guess that other flags could also trigger problems (`-save-temps` instead of `-no-integrated-cpp`). Full context (which is quite weird I'll admit): * To cache OpenCL kernel compilation results, we use the `-no-integrated-cpp` for the driver to generate a separate preprocessing command (`clang -E`) before the rest of the compilation. * Some OpenCL C language features are implemented as macro definitions (in `opencl-c-base.h`). The semantic analysis queries the preprocessor to check if these are defined or not, for example, when we checks if a builtin is available when using `-fdeclare-opencl-builtins`. * To preserve these `#define` directives, on the preprocessor's output, we use `-dD`. However, other `#define` directives are also maintained besides OpenCL ones; which triggers the issue shown in this PR. A better fix for our particular case could have been to move the language features implemented as macros into some sort of a flag to be used together with `-fdeclare-opencl-builtins`. But I also thought that not preprocessing preprocessor outputs seemed like something desirable. I hope to work on this on a follow up.
22 lines
689 B
C
22 lines
689 B
C
// RUN: %clang_cc1 -E -x c %s | FileCheck %s
|
|
// RUN: %clang_cc1 -x c -fsyntax-only %s -verify
|
|
// RUN: %clang_cc1 -x cpp-output -fsyntax-only -verify %s
|
|
// expected-no-diagnostics
|
|
|
|
// The preprocessor does not expand macro-identifiers in #pragma directives.
|
|
// When we preprocess & parse the code, clang expands the macros in directives.
|
|
// When we parse already preprocessed code, clang still has to expand the
|
|
// macros in the directives.
|
|
// This means that we're not always able to parse the preprocessor's output
|
|
// without preserving the definitions (-dD).
|
|
|
|
#define FACTOR 4
|
|
|
|
void foo() {
|
|
// CHECK: #pragma unroll FACTOR
|
|
#pragma unroll FACTOR
|
|
for(;;) {
|
|
}
|
|
return;
|
|
}
|