title: Incomplete types as function parameters and return values
body: <p>The following code <a href="https://godbolt.org/g/NdT26u" rel="noreferrer">compiles successfully both with <em>clang++ 5.0.0</em> and <em>g++ 7.2</em></a> (with the <code>-std=c++17 -Wall -Wextra -Werror -pedantic-errors -O0</code> compilation flags):</p>
  
  <pre><code>struct Foo;
  
  struct Bar
  {
      Foo get() const;
  
      void set(Foo);
  };
  
  struct Foo
  {
  };
  
  Foo Bar::get() const
  {
      return {};
  }
  
  void Bar::set(Foo)
  {
  }
  
  
  int main()
  {
      Bar bar{};
  
      (void)bar.get();
      bar.set(Foo{});
  }
  </code></pre>
  
  <p>Is it valid to use incomplete types as function parameters and return values? What does the C++ say on it?</p>