Add missing "non-constant" diagnostic for a member call on a temporary of
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 11 Jun 2014 19:53:12 +0000 (19:53 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 11 Jun 2014 19:53:12 +0000 (19:53 +0000)
non-literal class type.

llvm-svn: 210696

clang/lib/AST/ExprConstant.cpp
clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p6.cpp
clang/test/SemaCXX/constant-expression-cxx11.cpp

index 99b289a..c77d5e8 100644 (file)
@@ -2938,6 +2938,7 @@ static bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object,
   if (Object->getType()->isLiteralType(Info.Ctx))
     return EvaluateTemporary(Object, This, Info);
 
+  Info.Diag(Object, diag::note_constexpr_nonliteral) << Object->getType();
   return false;
 }
 
index bb7f7ac..370f732 100644 (file)
@@ -35,7 +35,7 @@ template<typename R> struct ConstexprMember {
   constexpr R F() const { return 0; }
 };
 constexpr int d = ConstexprMember<int>().F(); // ok
-constexpr int e = ConstexprMember<NonLiteral>().F(); // expected-error {{constant expression}}
+constexpr int e = ConstexprMember<NonLiteral>().F(); // expected-error {{constant expression}} expected-note {{non-literal type 'const NonLiteral' cannot be used in a constant expression}}
 
 template<typename ...P> struct ConstexprCtor {
   constexpr ConstexprCtor(P...) {}
index 574e9b3..8690124 100644 (file)
@@ -860,6 +860,12 @@ static_assert(f(T(5)) == 5, "");
 constexpr bool b(int n) { return &n; }
 static_assert(b(0), "");
 
+struct NonLiteral {
+  NonLiteral();
+  int f();
+};
+constexpr int k = NonLiteral().f(); // expected-error {{constant expression}} expected-note {{non-literal type 'Temporaries::NonLiteral'}}
+
 }
 
 namespace Union {