nridge added a comment.

A user on Discord just ran into this 
<https://discord.com/channels/636084430946959380/649134148723802113/1103941124642586664>
 again; I'd like to try and find a way forward with this mitigation.

Since we haven't heard from @dgoldman, I'd like to explore an alternative 
strategy: plumb in information about whether the `-xobjective-c++-header` came 
from the fallback flags, and alter it to `-xc++-header` only in that case.

@kadircet, would you be open to accepting this with the above change?



================
Comment at: clang-tools-extra/clangd/SystemIncludeExtractor.cpp:340
+    // is not installed.
+    if (Lang == "objective-c++-header") {
+      Lang = "c++-header";
----------------
nridge wrote:
> kadircet wrote:
> > nridge wrote:
> > > kadircet wrote:
> > > > this feels like too much of a layering violation and might (will?) go 
> > > > wrong in cases where language was explicitly set to 
> > > > `objective-c++-header`.
> > > > 
> > > > if the user is relying on fallback commands with an overwrite of 
> > > > `Compiler:` in the config && --query-driver globs, would it be too much 
> > > > of a hassle to expect them to have a `CompileFlags: Add: ...` block too?
> > > > this feels like too much of a layering violation and might (will?) go 
> > > > wrong in cases where language was explicitly set to 
> > > > `objective-c++-header`.
> > > 
> > > This has occurred to me, and my first idea for a fix was to limit this 
> > > change to cases where the `-xobjective-c++-header` originates from the 
> > > fallback command.
> > > 
> > > However, as mentioned 
> > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > paths returned by gcc. In other words, in gcc's include directory 
> > > structure there are no objc-specific directories. This made me think this 
> > > simpler fix would be appropriate.
> > > 
> > > > if the user is relying on fallback commands with an overwrite of 
> > > > `Compiler:` in the config && --query-driver globs, would it be too much 
> > > > of a hassle to expect them to have a `CompileFlags: Add: ...` block too?
> > > 
> > > You're right, adding a section like this to the config does seem to be a 
> > > viable workaround:
> > > 
> > > ```
> > > ---
> > > 
> > > If:
> > >   PathMatch: *\.h
> > > 
> > > CompileFlags:
> > >   Add: [-xc++-header]
> > > ```
> > > 
> > > But I think it would still be nice to fix this in clangd, as being foiled 
> > > by objective-c support not being installed is a very unexpected failure 
> > > mode for a user whose project does not involve objective-c at all.
> > > 
> > > For what it's worth, I don't think this kind of setup is uncommon. A 
> > > common scenario seems to be a casual user playing around with a small 
> > > project (hence, doesn't have a build system or compile_commands.json), on 
> > > a platform where --query-driver is needed to find the standard library 
> > > headers (most commonly, MinGW on Windows).
> > > However, as mentioned 
> > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > paths returned by gcc. In other words, in gcc's include directory 
> > > structure there are no objc-specific directories.
> > 
> > Well, that's definitely re-assuring, but I am not sure if it's enough to 
> > say it'll work that way with all gcc's or when there are other/certain 
> > "system" libraries installed. As in theory objc compilation should at least 
> > add some framework search paths and what not by default, no?
> > 
> > > But I think it would still be nice to fix this in clangd, as being foiled 
> > > by objective-c support not being installed is a very unexpected failure 
> > > mode for a user whose project does not involve objective-c at all.
> > 
> > Completely agree, but we're only showing that to people that already 
> > fiddled with clangd internals. So I don't think that as  unacceptable.
> >  
> > > For what it's worth, I don't think this kind of setup is uncommon. A 
> > > common scenario seems to be a casual user playing around with a small 
> > > project (hence, doesn't have a build system or compile_commands.json), on 
> > > a platform where --query-driver is needed to find the standard library 
> > > headers (most commonly, MinGW on Windows).
> > 
> > I think instead of trying to make things work with query-driver in such 
> > setups, we should try to make sure things work out-of-the-box in mingw (and 
> > other toolchain) setups. I believe people not using query-driver in such 
> > vanilla installation is way more common than people using query-driver and 
> > `CompileFlags.Compiler` override. Also this will probably make sure other 
> > clang-tools can work with those setups too.
> > We have mingw toolchain detection 
> > [here](https://github.com/llvm/llvm-project/blob/main/clang/lib/Driver/ToolChains/MinGW.cpp).
> > > However, as mentioned 
> > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > paths returned by gcc. In other words, in gcc's include directory 
> > > structure there are no objc-specific directories.
> > 
> > Well, that's definitely re-assuring, but I am not sure if it's enough to 
> > say it'll work that way with all gcc's or when there are other/certain 
> > "system" libraries installed. As in theory objc compilation should at least 
> > add some framework search paths and what not by default, no?
> 
> To be honest, I don't know enough about objective-c to say either way.
> 
> Perhaps @dgoldman can help us answer this question: would you expect the `-x 
> objective-c++` flag to cause the compiler to use any additional / objective-c 
> specific built-in include directories (compared to `-x c++`), for any 
> compiler you're aware of that has a gcc-compatible driver syntax?
> > > However, as mentioned 
> > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > paths returned by gcc. In other words, in gcc's include directory 
> > > structure there are no objc-specific directories.
> > 
> > Well, that's definitely re-assuring, but I am not sure if it's enough to 
> > say it'll work that way with all gcc's or when there are other/certain 
> > "system" libraries installed. As in theory objc compilation should at least 
> > add some framework search paths and what not by default, no?
> 
> To be honest, I don't know enough about objective-c to say either way.
> 
> Perhaps @dgoldman can help us answer this question: would you expect the `-x 
> objective-c++` flag to cause the compiler to use any additional / objective-c 
> specific built-in include directories (compared to `-x c++`), for any 
> compiler you're aware of that has a gcc-compatible driver syntax?




================
Comment at: clang-tools-extra/clangd/SystemIncludeExtractor.cpp:340
+    // is not installed.
+    if (Lang == "objective-c++-header") {
+      Lang = "c++-header";
----------------
nridge wrote:
> nridge wrote:
> > kadircet wrote:
> > > nridge wrote:
> > > > kadircet wrote:
> > > > > this feels like too much of a layering violation and might (will?) go 
> > > > > wrong in cases where language was explicitly set to 
> > > > > `objective-c++-header`.
> > > > > 
> > > > > if the user is relying on fallback commands with an overwrite of 
> > > > > `Compiler:` in the config && --query-driver globs, would it be too 
> > > > > much of a hassle to expect them to have a `CompileFlags: Add: ...` 
> > > > > block too?
> > > > > this feels like too much of a layering violation and might (will?) go 
> > > > > wrong in cases where language was explicitly set to 
> > > > > `objective-c++-header`.
> > > > 
> > > > This has occurred to me, and my first idea for a fix was to limit this 
> > > > change to cases where the `-xobjective-c++-header` originates from the 
> > > > fallback command.
> > > > 
> > > > However, as mentioned 
> > > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > > paths returned by gcc. In other words, in gcc's include directory 
> > > > structure there are no objc-specific directories. This made me think 
> > > > this simpler fix would be appropriate.
> > > > 
> > > > > if the user is relying on fallback commands with an overwrite of 
> > > > > `Compiler:` in the config && --query-driver globs, would it be too 
> > > > > much of a hassle to expect them to have a `CompileFlags: Add: ...` 
> > > > > block too?
> > > > 
> > > > You're right, adding a section like this to the config does seem to be 
> > > > a viable workaround:
> > > > 
> > > > ```
> > > > ---
> > > > 
> > > > If:
> > > >   PathMatch: *\.h
> > > > 
> > > > CompileFlags:
> > > >   Add: [-xc++-header]
> > > > ```
> > > > 
> > > > But I think it would still be nice to fix this in clangd, as being 
> > > > foiled by objective-c support not being installed is a very unexpected 
> > > > failure mode for a user whose project does not involve objective-c at 
> > > > all.
> > > > 
> > > > For what it's worth, I don't think this kind of setup is uncommon. A 
> > > > common scenario seems to be a casual user playing around with a small 
> > > > project (hence, doesn't have a build system or compile_commands.json), 
> > > > on a platform where --query-driver is needed to find the standard 
> > > > library headers (most commonly, MinGW on Windows).
> > > > However, as mentioned 
> > > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > > paths returned by gcc. In other words, in gcc's include directory 
> > > > structure there are no objc-specific directories.
> > > 
> > > Well, that's definitely re-assuring, but I am not sure if it's enough to 
> > > say it'll work that way with all gcc's or when there are other/certain 
> > > "system" libraries installed. As in theory objc compilation should at 
> > > least add some framework search paths and what not by default, no?
> > > 
> > > > But I think it would still be nice to fix this in clangd, as being 
> > > > foiled by objective-c support not being installed is a very unexpected 
> > > > failure mode for a user whose project does not involve objective-c at 
> > > > all.
> > > 
> > > Completely agree, but we're only showing that to people that already 
> > > fiddled with clangd internals. So I don't think that as  unacceptable.
> > >  
> > > > For what it's worth, I don't think this kind of setup is uncommon. A 
> > > > common scenario seems to be a casual user playing around with a small 
> > > > project (hence, doesn't have a build system or compile_commands.json), 
> > > > on a platform where --query-driver is needed to find the standard 
> > > > library headers (most commonly, MinGW on Windows).
> > > 
> > > I think instead of trying to make things work with query-driver in such 
> > > setups, we should try to make sure things work out-of-the-box in mingw 
> > > (and other toolchain) setups. I believe people not using query-driver in 
> > > such vanilla installation is way more common than people using 
> > > query-driver and `CompileFlags.Compiler` override. Also this will 
> > > probably make sure other clang-tools can work with those setups too.
> > > We have mingw toolchain detection 
> > > [here](https://github.com/llvm/llvm-project/blob/main/clang/lib/Driver/ToolChains/MinGW.cpp).
> > > > However, as mentioned 
> > > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > > paths returned by gcc. In other words, in gcc's include directory 
> > > > structure there are no objc-specific directories.
> > > 
> > > Well, that's definitely re-assuring, but I am not sure if it's enough to 
> > > say it'll work that way with all gcc's or when there are other/certain 
> > > "system" libraries installed. As in theory objc compilation should at 
> > > least add some framework search paths and what not by default, no?
> > 
> > To be honest, I don't know enough about objective-c to say either way.
> > 
> > Perhaps @dgoldman can help us answer this question: would you expect the 
> > `-x objective-c++` flag to cause the compiler to use any additional / 
> > objective-c specific built-in include directories (compared to `-x c++`), 
> > for any compiler you're aware of that has a gcc-compatible driver syntax?
> > > > However, as mentioned 
> > > > [here](https://github.com/clangd/clangd/issues/1568#issuecomment-1493236437),
> > > >  when I tested this I found that `-xobjective-c++-header` did not make 
> > > > any difference (compared to `-xc++-header` or  `-xc++`) in the include 
> > > > paths returned by gcc. In other words, in gcc's include directory 
> > > > structure there are no objc-specific directories.
> > > 
> > > Well, that's definitely re-assuring, but I am not sure if it's enough to 
> > > say it'll work that way with all gcc's or when there are other/certain 
> > > "system" libraries installed. As in theory objc compilation should at 
> > > least add some framework search paths and what not by default, no?
> > 
> > To be honest, I don't know enough about objective-c to say either way.
> > 
> > Perhaps @dgoldman can help us answer this question: would you expect the 
> > `-x objective-c++` flag to cause the compiler to use any additional / 
> > objective-c specific built-in include directories (compared to `-x c++`), 
> > for any compiler you're aware of that has a gcc-compatible driver syntax?
> 
> 
Circling back to reply to some of the other points made here:

> > But I think it would still be nice to fix this in clangd, as being foiled 
> > by objective-c support not being installed is a very unexpected failure 
> > mode for a user whose project does not involve objective-c at all.
> 
> Completely agree, but we're only showing that to people that already fiddled 
> with clangd internals. So I don't think that as  unacceptable.

FWIW, having fielded many user questions in the Discord channel and on 
StackOverflow, my impression is that having to use `--query-driver` is a very 
frequent need. Often users just starting out with clangd trying to get their 
standard library includes need to use it. So, I don't think we should view it 
as something advanced, or as "clangd internals", and if we can make the 
experience smoother by addressing issues like this, we should do so.

> > For what it's worth, I don't think this kind of setup is uncommon. A common 
> > scenario seems to be a casual user playing around with a small project 
> > (hence, doesn't have a build system or compile_commands.json), on a 
> > platform where --query-driver is needed to find the standard library 
> > headers (most commonly, MinGW on Windows).
> 
> I think instead of trying to make things work with query-driver in such 
> setups, we should try to make sure things work out-of-the-box in mingw (and 
> other toolchain) setups. I believe people not using query-driver in such 
> vanilla installation is way more common than people using query-driver and 
> `CompileFlags.Compiler` override. Also this will probably make sure other 
> clang-tools can work with those setups too.
> We have mingw toolchain detection 
> [here](https://github.com/llvm/llvm-project/blob/main/clang/lib/Driver/ToolChains/MinGW.cpp).

Definitely, if we can reduce the set of scenarios in which users need 
`--query-driver` at all, that's a bigger win!

But it's also a more involved effort, and in the case of MinGW probably better 
undertaken by someone who uses Windows and can test things out there.

Meanwhile, I'm hoping we can achieve a smaller and easier win with this 
proposed change.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D147905/new/

https://reviews.llvm.org/D147905

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to