ki.stfu added a comment.

In https://reviews.llvm.org/D29256#660159, @krytarowski wrote:

> It's undefined (implementation defined) behavior.
>
>   C++11 5.2.2/7:
>   
>
> >   Passing a potentially-evaluated argument of class type having a 
> > non-trivial copy constructor, a non-trivial move contructor, or a 
> > non-trivial destructor, with no corresponding parameter, is 
> > conditionally-supported with implementation-defined semantics.
> >    


Interesting. Passing to what? I thought it means we shouldn't pass non-trivial 
types through variadic arguments (`...` expression), and in this case we don't 
do it because `CMIUtilString` is the type of the parameter `vFormating` which 
has a name.

Unfortunately I can't reproduce it on my Ubuntu using the following example:

  #include <cstdarg>
  #include <iostream>
   
  struct Count {
      int value;
      explicit Count(int v) : value(v) { }
      // Make it non-trivial
      Count(const Count&) : value(0) { }
      Count(Count&&)      : value(0) { }
      ~Count() { if (value) value |= 1; }
  };
   
  int add_nums(Count count, ...) 
  {
      int result = 0;
      va_list args;
      va_start(args, count);
      for (int i = 0; i < count.value; ++i) {
          result += va_arg(args, int);
      }
      va_end(args);
      return result;
  }
   
  int main() 
  {
      std::cout << add_nums(Count(4), 25, 25, 50, 50) << '\n';
      return 0;
  }



> This patch was created to address compiler warning.

Could you tell me what compiler and platform do you use and provide the exact 
warning message?


Repository:
  rL LLVM

https://reviews.llvm.org/D29256



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

Reply via email to