1d593190132244b0194d480ec3e55f94f369c8863Eli Friedman// RUN: %clang_cc1 -fsyntax-only -verify %s
2d593190132244b0194d480ec3e55f94f369c8863Eli Friedman// PR9615
3d593190132244b0194d480ec3e55f94f369c8863Eli Friedman
4d593190132244b0194d480ec3e55f94f369c8863Eli Friedmanstruct Resource {
5d593190132244b0194d480ec3e55f94f369c8863Eli Friedman  void doit();
6d593190132244b0194d480ec3e55f94f369c8863Eli Friedman};
7d593190132244b0194d480ec3e55f94f369c8863Eli Friedman
8d593190132244b0194d480ec3e55f94f369c8863Eli Friedmantemplate<int x> struct Lock {
9d593190132244b0194d480ec3e55f94f369c8863Eli Friedman  ~Lock() { int a[x]; } // expected-error {{declared as an array with a negative size}}
10d593190132244b0194d480ec3e55f94f369c8863Eli Friedman  Resource* operator->() { return 0; }
11d593190132244b0194d480ec3e55f94f369c8863Eli Friedman};
12d593190132244b0194d480ec3e55f94f369c8863Eli Friedman
13d593190132244b0194d480ec3e55f94f369c8863Eli Friedmanstruct Accessor {
14d593190132244b0194d480ec3e55f94f369c8863Eli Friedman  Lock<-1> operator->();
15d593190132244b0194d480ec3e55f94f369c8863Eli Friedman};
16d593190132244b0194d480ec3e55f94f369c8863Eli Friedman
17d593190132244b0194d480ec3e55f94f369c8863Eli Friedman// Make sure we try to instantiate the destructor for Lock here
18d593190132244b0194d480ec3e55f94f369c8863Eli Friedmanvoid f() { Accessor acc; acc->doit(); } // expected-note {{requested here}}
19d593190132244b0194d480ec3e55f94f369c8863Eli Friedman
20