[PATCH] D136554: Implement CWG2631
Jordan Rupprecht via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 20 17:52:41 PST 2022
rupprecht added a comment.
Sorry for the delay, I was out on vacation for a bit. I have a repro for this new issue now: F25778542: repro.tar.gz <https://reviews.llvm.org/F25778542>
$ CLANG=~/dev/clang ./repro.sh
++ dirname /tmp/repro/repro.sh
+ DIR=/tmp/repro
+ : /tmp/D136554
+ rm -rf /tmp/D136554
+ mkdir -p /tmp/D136554
+ cd /tmp/D136554
+ cp /tmp/repro/lib.h /tmp/repro/outer.h /tmp/repro/x.h /tmp/repro/y.h /tmp/repro/z.h /tmp/repro/lib.cppmap /tmp/repro/outer.cppmap /tmp/repro/x.cppmap /tmp/repro/y.cppmap /tmp/repro/z.cppmap .
+ COMMON_ARGS=('-Wno-mismatched-tags' '-Xclang=-fmodules-embed-all-files' '-Xclang=-fmodules-local-submodule-visibility' '-fmodules' '-fno-implicit-modules' '-fno-implicit-module-maps' '-std=gnu++17' '-Xclang=-fmodule-map-file-home-is-cwd')
+ export COMMON_ARGS
+ /home/rupprecht/dev/clang -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files -Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules -fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -fmodule-name=x -fmodule-map-file=x.cppmap -fmodule-map-file=lib.cppmap -xc++ -Xclang=-emit-module -c x.cppmap -o x.pcm
+ /home/rupprecht/dev/clang -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files -Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules -fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -fmodule-name=y -fmodule-map-file=y.cppmap -fmodule-map-file=lib.cppmap -fmodule-map-file=z.cppmap -xc++ -Xclang=-emit-module -c y.cppmap -o y.pcm
+ /home/rupprecht/dev/clang -Wno-mismatched-tags -Xclang=-fmodules-embed-all-files -Xclang=-fmodules-local-submodule-visibility -fmodules -fno-implicit-modules -fno-implicit-module-maps -std=gnu++17 -Xclang=-fmodule-map-file-home-is-cwd -fmodule-name=outer -fmodule-map-file=outer.cppmap -Xclang=-fmodule-file=x.pcm -Xclang=-fmodule-file=y.pcm -fmodule-map-file=lib.cppmap -fmodule-map-file=x.cppmap -fmodule-map-file=y.cppmap -xc++-header -fsyntax-only -c outer.h -o outer.h.processed
In module 'x':
./lib.h:5:25: error: 'Foo' has different definitions in different modules; first difference is definition in module 'x.x.h' found data member 'kConstant' with an initializer
static constexpr char kConstant = '+';
~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
./lib.h:5:25: note: but in 'y.y.h' found data member 'kConstant' with a different initializer
static constexpr char kConstant = '+';
~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
1 error generated.
In D136554#4000654 <https://reviews.llvm.org/D136554#4000654>, @cor3ntin wrote:
> In D136554#4000363 <https://reviews.llvm.org/D136554#4000363>, @rupprecht wrote:
>
>> I applied this version of the patch and the crash is now gone 🎉
>>
>> However, now I get this inexplicable error -- I'm not entirely sure it's related, maybe I'm holding it wrong:
>>
>> In module '<foo>':
>> foo.h$line:$num: error: 'foo::FooClass' has different definitions in different modules; first difference is definition in module 'something.h' found data member 'kFooDelimiter' with an initializer
>> static constexpr char kFooDelimiter = '+';
>> ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
>> foo.h:$line:$num note: but in 'other.h' found data member 'kFooDelimiter' with a different initializer
>> static constexpr char kFooDelimiter = '+';
>> ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
>>
>> The definition seems straightforward:
>>
>> class FooClass final {
>> ...
>> static constexpr char kFooDelimiter = '+';
>> ...
>> };
>
> This is *very* surprising to me.
> I could explain it if the member was not static though, as it would be the kind of things the patch affects. But static data members are handled very differently.
>
> Was that liking chrome? It didn't come up in my tests
No, it's some other internal target. There isn't any way for you to be able to test against these targets, so unfortunately the best I can offer is I'll patch in any updated versions of this patch, see what breaks, and try to reduce it when reporting.
There's barely any code in the repro I attached, it's just a bunch of header/module layering. My guess is that clang is usually able to see that the two definitions in different modules is the same and therefore dedupes them, but this change adds some unique bit of information that makes clang think it's different. Note that the headers need to be in a particular order to break.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D136554/new/
https://reviews.llvm.org/D136554
More information about the cfe-commits
mailing list