]> granicus.if.org Git - clang/commitdiff
Pedantic diagnostic correction: in C++, we have integral constant expressions,
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 15 Jan 2012 03:51:30 +0000 (03:51 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 15 Jan 2012 03:51:30 +0000 (03:51 +0000)
not integer constant expressions. In passing, fix the 'folding is an extension'
diagnostic to not claim we're accepting the code, since that's not true in
-pedantic-errors mode, and add this diagnostic to -Wgnu.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/CXX/expr/expr.const/p2-0x.cpp
test/Misc/warning-flags.c
test/Sema/PR2963-enum-constant.c
test/SemaCXX/constant-expression-cxx11.cpp
test/SemaCXX/constant-expression.cpp
test/SemaCXX/enum-bitfield.cpp
test/SemaCXX/enum.cpp
test/SemaCXX/i-c-e-cxx.cpp
test/SemaTemplate/instantiate-expr-1.cpp

index a114dd35bc3474e8b7029a531fbe99c47c0cdb53..049074d6e5b1125e8b53f2f1bec9e1e37385e41a 100644 (file)
@@ -16,10 +16,10 @@ let CategoryName = "Semantic Issue" in {
 
 // Constant expressions
 def err_expr_not_ice : Error<
-  "expression is not an integer constant expression">;
+  "expression is not an %select{integer|integral}0 constant expression">;
 def ext_expr_not_ice : Extension<
-  "expression is not integer constant expression "
-  "(but is allowed as an extension)">;
+  "expression is not an %select{integer|integral}0 constant expression; "
+  "folding it to a constant is a GNU extension">, InGroup<GNU>;
 
 // Semantic analysis of constant literals.
 def ext_predef_outside_function : Warning<
index 75caa6f5855ab48292626b0b735479e4f1e44134..e2a9404d215f9f7b76bc5ca637caafd3c020299e 100644 (file)
@@ -9268,9 +9268,11 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result,
   }
 
   if (!Folded || !AllowFold) {
-    Diag(E->getSourceRange().getBegin(),
-         DiagID ? DiagID : unsigned(diag::err_expr_not_ice))
-      << E->getSourceRange();
+    if (DiagID)
+      Diag(E->getSourceRange().getBegin(), DiagID) << E->getSourceRange();
+    else
+      Diag(E->getSourceRange().getBegin(), diag::err_expr_not_ice)
+        << E->getSourceRange() << LangOpts.CPlusPlus;
 
     // We only show the notes if they're not the usual "invalid subexpression"
     // or if they are actually in a subexpression.
@@ -9285,12 +9287,9 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result,
   }
 
   Diag(E->getSourceRange().getBegin(), diag::ext_expr_not_ice)
-    << E->getSourceRange();
-
-  if (Diags.getDiagnosticLevel(diag::ext_expr_not_ice, E->getExprLoc())
-          != DiagnosticsEngine::Ignored)
-    for (unsigned I = 0, N = Notes.size(); I != N; ++I)
-      Diag(Notes[I].first, Notes[I].second);
+    << E->getSourceRange() << LangOpts.CPlusPlus;
+  for (unsigned I = 0, N = Notes.size(); I != N; ++I)
+    Diag(Notes[I].first, Notes[I].second);
 
   if (Result)
     *Result = EvalResult.Val.getInt();
index cece22d9b2388514c15e4daa5cadca59e16f0036..05ebb31effb3c37eb1e8a959cfcdc2f14a32dd11 100644 (file)
@@ -136,7 +136,7 @@ namespace UndefinedBehavior {
   }
   constexpr int n = (f(p), 0); // expected-error {{constant expression}} expected-note {{in call to 'f(&s.m + 1)'}}
   struct T {
-    int n : f(p); // expected-error {{not an integer constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
+    int n : f(p); // expected-error {{not an integral constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
   };
 
   namespace Ptr {
index 42c09cbe7d1bed3c87da8cd7098ab38f1808edad..29225f249ada24447fc9a5c9bd4953423e21c8d4 100644 (file)
@@ -17,7 +17,7 @@ This test serves two purposes:
 
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.
 
-CHECK: Warnings without flags (267):
+CHECK: Warnings without flags (266):
 CHECK-NEXT:   ext_anon_param_requires_type_specifier
 CHECK-NEXT:   ext_anonymous_struct_union_qualified
 CHECK-NEXT:   ext_array_init_copy
@@ -35,7 +35,6 @@ CHECK-NEXT:   ext_enumerator_list_comma
 CHECK-NEXT:   ext_expected_semi_decl_list
 CHECK-NEXT:   ext_explicit_instantiation_without_qualified_id
 CHECK-NEXT:   ext_explicit_specialization_storage_class
-CHECK-NEXT:   ext_expr_not_ice
 CHECK-NEXT:   ext_extra_ivar_semi
 CHECK-NEXT:   ext_extra_struct_semi
 CHECK-NEXT:   ext_forward_ref_enum
index 1900eefc7c624d7213799d2de8747d2c6addadd5..43daabf58ed88883f49729138a8265a0c1116363 100644 (file)
@@ -13,5 +13,5 @@ enum
 
 enum
 {
-        SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1) // expected-warning{{expression is not integer constant expression}}
+        SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1) // expected-warning{{expression is not an integer constant expression}}
 };
index e20f8f32b57d4f30cd8afb9bb639f074ef9fed4e..b1b4f38a4b5b39ee24c83e382054d2692496f5c9 100644 (file)
@@ -93,7 +93,7 @@ namespace CaseStatements {
   void f(int n) {
     switch (n) {
     // FIXME: Produce the 'add ()' fixit for this.
-    case MemberZero().zero: // desired-error {{did you mean to call it with no arguments?}} expected-error {{not an integer constant expression}} expected-note {{non-literal type '<bound member function type>'}}
+    case MemberZero().zero: // desired-error {{did you mean to call it with no arguments?}} expected-error {{not an integral constant expression}} expected-note {{non-literal type '<bound member function type>'}}
     case id(1):
       return;
     }
@@ -299,27 +299,26 @@ constexpr S* sptr = &s;
 constexpr bool dyncast = sptr == dynamic_cast<S*>(sptr); // expected-error {{constant expression}} expected-note {{dynamic_cast}}
 
 struct Str {
-  // FIXME: In C++ mode, we should say 'integral' not 'integer'
   int a : dynamic_cast<S*>(sptr) == dynamic_cast<S*>(sptr); // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{dynamic_cast is not allowed in a constant expression}}
   int b : reinterpret_cast<S*>(sptr) == reinterpret_cast<S*>(sptr); // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{reinterpret_cast is not allowed in a constant expression}}
   int c : (S*)(long)(sptr) == (S*)(long)(sptr); // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
   int d : (S*)(42) == (S*)(42); // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
   int e : (Str*)(sptr) == (Str*)(sptr); // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
   int f : &(Str&)(*sptr) == &(Str&)(*sptr); // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
   int g : (S*)(void*)(sptr) == sptr; // \
-    expected-warning {{not integer constant expression}} \
+    expected-warning {{not an integral constant expression}} \
     expected-note {{cast from 'void *' is not allowed in a constant expression}}
 };
 
index 061e77591b1e7f5777583f61ab433542a2e9b5b5..23a4dda70838c755b63377256cc9751611e46c2e 100644 (file)
@@ -88,10 +88,10 @@ enum {
 
 void diags(int n) {
   switch (n) {
-    case (1/0, 1): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
-    case (int)(1/0, 2.0): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
-    case __imag(1/0): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
-    case (int)__imag((double)(1/0)): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
+    case (1/0, 1): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
+    case (int)(1/0, 2.0): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
+    case __imag(1/0): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
+    case (int)__imag((double)(1/0)): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
       ;
   }
 }
index 1a657408f8a61ac85f57c61f834113c860c2628e..831b9825111b7bf505f767b8bc99bf92c05509f1 100644 (file)
@@ -14,5 +14,5 @@ struct X {
 
 struct Y {
   enum E : int(2);
-  enum E : Z(); // expected-error{{not an integer constant}}
+  enum E : Z(); // expected-error{{not an integral constant}}
 };
index b4a050cb0908e7b4519c01938f5deade0a8bd289..370e1c34d29c8e736b58960e6f7da04b92b4e6ef 100644 (file)
@@ -88,7 +88,7 @@ typedef enum { }; // expected-warning{{typedef requires a name}}
 
 // PR7921
 enum PR7921E {
-    PR7921V = (PR7921E)(123) // expected-error {{expression is not an integer constant expression}}
+    PR7921V = (PR7921E)(123) // expected-error {{expression is not an integral constant expression}}
 };
 
 void PR8089() {
index 47a47b5e2f1b5925f0d9725f93f74a14a199aaf8..0bfd221a4cb1f85869f0aa00a0c8c0bb959208ed 100644 (file)
@@ -18,7 +18,7 @@ void f() {
 int a() {
   const int t=t; // expected-note {{declared here}}
   switch(1) { // expected-warning {{no case matching constant switch condition '1'}}
-    case t:; // expected-error {{not an integer constant expression}} expected-note {{initializer of 't' is not a constant expression}}
+    case t:; // expected-error {{not an integral constant expression}} expected-note {{initializer of 't' is not a constant expression}}
   }
 }
 
index 08f5e9d9a7f0bb260e8fe457e08dfba3b6138edd..9395117e9ce4871573f2c75d2a937c316ff139e7 100644 (file)
@@ -34,7 +34,7 @@ void test_BitfieldMinus() {
 
 template<int I, int J>
 struct BitfieldDivide {
-  int bitfield : I / J; // expected-error{{expression is not an integer constant expression}} \
+  int bitfield : I / J; // expected-error{{expression is not an integral constant expression}} \
                         // expected-note{{division by zero}}
 };