constant-expression-cxx11.cpp revision 4f87062cb411d5a31cf39f1ac576bba4123930f2
1b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenektemplate<typename T> constexpr T id(const T &t) { return t; }
477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekstruct MemberZero {
677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek  constexpr int zero() { return 0; }
777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek};
877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremeneknamespace TemplateArgumentConversion {
10b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  template<int n> struct IntParam {};
1141573ebf8fb971f40fa8a3e20648362c359b4916Ted Kremenek
12b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek  using IntParam0 = IntParam<0>;
1377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek  // FIXME: This should be accepted once we do constexpr function invocation.
1477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek  using IntParam0 = IntParam<id(0)>; // expected-error {{not an integral constant expression}}
1577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek  using IntParam0 = IntParam<MemberZero().zero>; // expected-error {{did you mean to call it with no arguments?}} expected-error {{not an integral constant expression}}
16d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek}
17d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek
18d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremeneknamespace CaseStatements {
191309f9a3b225ea846e5822691c39a77423125505Ted Kremenek  void f(int n) {
201309f9a3b225ea846e5822691c39a77423125505Ted Kremenek    switch (n) {
211309f9a3b225ea846e5822691c39a77423125505Ted Kremenek    // FIXME: Produce the 'add ()' fixit for this.
221309f9a3b225ea846e5822691c39a77423125505Ted Kremenek    case MemberZero().zero: // desired-error {{did you mean to call it with no arguments?}} expected-error {{not an integer constant expression}}
231309f9a3b225ea846e5822691c39a77423125505Ted Kremenek    // FIXME: This should be accepted once we do constexpr function invocation.
246b67630d5df195f4fe0e4273061c016901d69681Ted Kremenek    case id(1): // expected-error {{not an integer constant expression}}
25c0c3f5dbc9e78aa53a86c7d5e3eeda23ddad93d6Ted Kremenek      return;
26f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff    }
27bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu  }
2877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek}
291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump