]> granicus.if.org Git - clang/commitdiff
<rdar://problem/13584715> Converted constant expressions are expected to have integra...
authorDouglas Gregor <dgregor@apple.com>
Mon, 8 Apr 2013 23:24:07 +0000 (23:24 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 8 Apr 2013 23:24:07 +0000 (23:24 +0000)
We were assuming that any expression used as a converted constant
expression would either not have a folded constant value or would be
an integer, which is not the case for some ill-formed constant
expressions. Because converted constant expressions are only used
where integral values are expected, we can simply treat this as an
error path. If that ever changes, we'll need to widen the interface of
Sema::CheckConvertedConstantExpression() anyway.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179068 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp

index 805fdd8b578f8c1526adbfe0ec04fca59ecf5655..22b2a4a57d742557bcc322e6aaf8ae7c982d855a 100644 (file)
@@ -5024,7 +5024,7 @@ ExprResult Sema::CheckConvertedConstantExpression(Expr *From, QualType T,
   Expr::EvalResult Eval;
   Eval.Diag = &Notes;
 
-  if (!Result.get()->EvaluateAsRValue(Eval, Context)) {
+  if (!Result.get()->EvaluateAsRValue(Eval, Context) || !Eval.Val.isInt()) {
     // The expression can't be folded, so we can't keep it at this position in
     // the AST.
     Result = ExprError();
index cafdd635518c9280941db70288caa6d9ce656586..0cef31b6c8692819080fafa03e1b8dc367beaa40 100644 (file)
@@ -137,3 +137,19 @@ namespace DR1364 {
     return kGlobal; // expected-note {{read of non-const}}
   }
 }
+
+namespace rdar13584715 {
+  typedef __PTRDIFF_TYPE__ ptrdiff_t;
+  
+  template<typename T> struct X {
+    static T value() {};
+  };
+  
+  void foo(ptrdiff_t id) {
+    switch (id) {
+    case reinterpret_cast<ptrdiff_t>(&X<long>::value):  // expected-error{{case value is not a constant expression}} \
+      // expected-note{{reinterpret_cast is not allowed in a constant expression}}
+      break;
+    }
+  }
+}