diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -367,6 +367,7 @@ * \see clang_createIndex() */ unsigned DisplayDiagnostics : 1; + unsigned /*Reserved*/ : 14; /** * The path to a directory, in which to store temporary PCH files. If null or * empty, the default system temporary directory is used. These PCH files are diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -3724,6 +3724,13 @@ // if (options->Size >= offsetof(CXIndexOptions, RecentlyAddedMember)) // do_something(options->RecentlyAddedMember); + // An exception: if a new option is small enough, it can be squeezed into the + // /*Reserved*/ bits in CXIndexOptions. Since the default value of each option + // is guaranteed to be 0 and the callers are advised to zero out the struct, + // programs built against older libclang versions would implicitly set the new + // options to default values, which should keep the behavior of previous + // libclang versions and thus be backward-compatible. + // If options->Size > sizeof(CXIndexOptions), the user may have set an option // we can't handle, in which case we return nullptr to report failure. // Replace `!=` with `>` here to support older struct versions. `!=` has the