128bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer// RUN: %clang_cc1 -std=c++1y -fblocks -fsyntax-only -verify %s
228bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer// PR16946
328bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer// expected-no-diagnostics
428bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer
528bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramerauto foo() {
628bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__func__) == 4, "foo");
728bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__FUNCTION__) == 4, "foo");
828bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "auto foo()");
928bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  return 0;
1028bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer}
1128bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer
1228bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramerauto bar() -> decltype(42) {
1328bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__func__) == 4, "bar");
1428bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__FUNCTION__) == 4, "bar");
1528bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__PRETTY_FUNCTION__) == 10, "int bar()");
1628bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  return 0;
1728bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer}
1828bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer
193312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan// Within templates.
203312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pantemplate <typename T>
213312933e244d820c1c6fec83c4c0c0f67f42d25bWei Panint baz() {
223312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  static_assert(sizeof(__func__) == 4, "baz");
233312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  static_assert(sizeof(__FUNCTION__) == 4, "baz");
243312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]");
253312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
263312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  []() {
273312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__func__) == 11, "operator()");
283312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__FUNCTION__) == 11, "operator()");
293312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__PRETTY_FUNCTION__) == 50,
303312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan                  "auto baz()::<anonymous class>::operator()() const");
313312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    return 0;
323312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  }
333312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  ();
343312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
353312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  ^{
363312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    // FIXME: This is obviously wrong.
373312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__func__) == 1, "__baz_block_invoke");
383312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__FUNCTION__) == 1, "__baz_block_invoke");
393312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__PRETTY_FUNCTION__) == 1, "__baz_block_invoke");
403312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  }
413312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  ();
423312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
433312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  #pragma clang __debug captured
443312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  {
453312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__func__) == 4, "baz");
463312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__FUNCTION__) == 4, "baz");
473312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan    static_assert(sizeof(__PRETTY_FUNCTION__) == 20, "int baz() [T = int]");
483312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  }
493312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
503312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  return 0;
513312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan}
523312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
5328bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramerint main() {
5428bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__func__) == 5, "main");
5528bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__FUNCTION__) == 5, "main");
5628bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
5728bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer
5828bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  []() {
5928bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    static_assert(sizeof(__func__) == 11, "operator()");
6028bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    static_assert(sizeof(__FUNCTION__) == 11, "operator()");
6128bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    static_assert(sizeof(__PRETTY_FUNCTION__) == 51,
6228bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer                  "auto main()::<anonymous class>::operator()() const");
6328bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    return 0;
6428bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  }
6528bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  ();
6628bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer
6728bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  ^{
6828bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    // FIXME: This is obviously wrong.
6928bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    static_assert(sizeof(__func__) == 1, "__main_block_invoke");
7028bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    static_assert(sizeof(__FUNCTION__) == 1, "__main_block_invoke");
7128bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer    static_assert(sizeof(__PRETTY_FUNCTION__) == 1, "__main_block_invoke");
7228bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  }
7328bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer  ();
7415b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan
7515b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan  #pragma clang __debug captured
7615b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan  {
7715b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    static_assert(sizeof(__func__) == 5, "main");
7815b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    static_assert(sizeof(__FUNCTION__) == 5, "main");
7915b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
8015b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan
8115b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    #pragma clang __debug captured
8215b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    {
8315b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan      static_assert(sizeof(__func__) == 5, "main");
8415b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan      static_assert(sizeof(__FUNCTION__) == 5, "main");
8515b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan      static_assert(sizeof(__PRETTY_FUNCTION__) == 11, "int main()");
8615b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    }
8715b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan  }
8815b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan
8915b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan  []() {
9015b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    #pragma clang __debug captured
9115b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    {
9215b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan      static_assert(sizeof(__func__) == 11, "operator()");
9315b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan      static_assert(sizeof(__FUNCTION__) == 11, "operator()");
9415b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan      static_assert(sizeof(__PRETTY_FUNCTION__) == 51,
9515b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan                    "auto main()::<anonymous class>::operator()() const");
9615b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan    }
9715b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan  }
9815b2674896371ac2a0fe707b538a1a29dec9d8e4Wei Pan  ();
993312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
1003312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  baz<int>();
1013312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan
1023312933e244d820c1c6fec83c4c0c0f67f42d25bWei Pan  return 0;
10328bdbf0861fefb33474fddbda1d3c66ee29be2afBenjamin Kramer}
104