ChuanqiXu added a comment.

In D137787#3921673 <https://reviews.llvm.org/D137787#3921673>, @Hahnfeld wrote:

> I've trimmed the failing code down to
>
>   #include <string>
>   #include <string_view>
>   #include <vector>
>   
>   template <typename T>
>   struct SO {
>     void a() {
>       struct SI {
>         std::vector<int> v;
>       };
>       SI s;
>       SI m(std::move(s));
>     }
>   
>     void g() {
>       std::vector<std::string_view> v{"a"};
>     }
>   };
>
> in a header / module and
>
>   SO<int> s;
>   s.a();
>   s.g();
>
> in the calling code. Sadly this works fine in standalone Clang...
>
> All of the above code seems to be important, starting from the outer 
> `template`, having two functions, moving a `std::vector` from a default 
> generated move constructor and then constructing a 
> `std::vector<std::string_view>` with at least one element. If this rings a 
> bell for anybody or anybody has an idea where to go from here, please let me 
> know. I'm out of depth how to produce the exact failing conditions in a test. 
> I would argue that relaxing the `assert` is fine regardless because it still 
> tests that the `DtorDecl` belongs to this type, but I can't articulate why an 
> exact pointer comparison fails in very rare circumstances...

So the code look like:

  // foo.h
  #include <string>
  #include <string_view>
  #include <vector>
  
  template <typename T>
  struct SO {
    void a() {
      struct SI {
        std::vector<int> v;
      };
      SI s;
      SI m(std::move(s));
    }
  
    void g() {
      std::vector<std::string_view> v{"a"};
    }
  };
  
  // foo.cpp
  import "foo.h";
  void func() {
      SO<int> s;
      s.a();
      s.g();
  }

Is it the reproducer? If it is, my suggestion would be:

- Preprocess `foo.h` into `foo.ii` then replace `import "foo.h";`
- Then reduce `foo.ii` step by step. There should be many things that can be 
removed.
- Then we found there is no things we can reduce, then it should be the test.

I know it sounds too hard at first. But I tried and it works although it would 
take one whole day. Here is an example for the reduced test case: 
https://github.com/llvm/llvm-project/commit/1aaba40dcbe8fdc93d825d1f4e22edaa3e9aa5b1,
 which is reduced from 2 system headers which contains 30,000+ lines of code.

> I would argue that relaxing the `assert` is fine regardless

Yes, I understood. But we hope it can land with a test case really. Otherwise, 
the same use case may be broken some time again without being noticed by any 
one.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D137787

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

Reply via email to