re PR c++/15337 (sizeof on incomplete type diagnostic)
authorMark Mitchell <mark@codesourcery.com>
Mon, 7 Jun 2004 15:54:15 +0000 (15:54 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 7 Jun 2004 15:54:15 +0000 (15:54 +0000)
PR c++/15337
* error.c (c_sizeof_or_alignof_type): Use more detailed error
message.

PR c++/15766
* parser.c (cp_parser_iteration_statement): Fix typo in error
message.

PR c++/14777
* pt.c (tsubst_default_argument): Do not defer access checks
while substituting into the default argument.

PR c++/15554
* pt.c (tsubst_copy): Do not try to substitute for an enumeration
constant in a non-dependent context.

PR c++/15057
* except.c (build_throw): Ensure that temp_expr has been
initialized.

PR c++/15337
* g++.dg/expr/sizeof3.C: New test.

PR c++/14777
* g++.dg/template/access14.C: New test.

PR c++/15554
* g++.dg/template/enum1.C: New test.

PR c++/15057
* g++.dg/eh/throw1.C: New test.

From-SVN: r82693

gcc/ChangeLog
gcc/c-common.c
gcc/cp/ChangeLog
gcc/cp/except.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/throw1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/expr/sizeof3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/access14.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/enum1.C [new file with mode: 0644]

index 98dd0160724162f634ad30a95e80b385f306d5a9..200b595cdef6ea24320fd807fca967295aa2e54a 100644 (file)
@@ -1,3 +1,9 @@
+2004-06-07  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15337
+       * error.c (c_sizeof_or_alignof_type): Use more detailed error
+       message.
+
 2004-06-06  Paolo Bonzini  <bonzini@gnu.org>
 
        * config.in: Regenerate.
index 4b2b35501f0e71565492b81c55038dae71f693a3..89bc80e93536a3d5ce3aec7bb0f71d7eee6b3f09 100644 (file)
@@ -3060,7 +3060,8 @@ c_sizeof_or_alignof_type (tree type, enum tree_code op, int complain)
   else if (!COMPLETE_TYPE_P (type))
     {
       if (complain)
-       error ("invalid application of `%s' to an incomplete type", op_name);
+       error ("invalid application of `%s' to incomplete type `%T' ", 
+              op_name, type);
       value = size_zero_node;
     }
   else
index 5bb506e58f5b61d3fe1c3d47b91678a8516eb181..6dfe64a1fdee3932e5a3fed86fc4006e26fb1e4f 100644 (file)
@@ -1,3 +1,21 @@
+2004-06-07  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15766
+       * parser.c (cp_parser_iteration_statement): Fix typo in error
+       message.
+
+       PR c++/14777
+       * pt.c (tsubst_default_argument): Do not defer access checks
+       while substituting into the default argument.
+
+       PR c++/15554
+       * pt.c (tsubst_copy): Do not try to substitute for an enumeration
+       constant in a non-dependent context. 
+       
+       PR c++/15057
+       * except.c (build_throw): Ensure that temp_expr has been
+       initialized.
+
 2004-06-06  Roger Sayle  <roger@eyesopen.com>
 
        * cp/cp-tree.h (lvalue_or_else): Add function prototype.
index 79f1dfac0d90b1c1479a23486a2e9cb1e04f4120..69813d3ac7bf84b4bea14eced4629371669f3043 100644 (file)
@@ -684,6 +684,7 @@ build_throw (tree exp)
          because it will only return false in cases where elided is true,
          and therefore we don't need to work around the failure to
          preevaluate.  */
+      temp_expr = NULL_TREE;
       stabilize_init (exp, &temp_expr);
 
       if (elided)
index 0c94f7102db6fe1254f1320b1a3fccdb4b52e460..d094d306ee8c7267e634415e563eb0d1bad0b190 100644 (file)
@@ -6138,8 +6138,8 @@ cp_parser_iteration_statement (cp_parser* parser)
          expression = cp_parser_expression (parser);
        finish_for_expr (expression, statement);
        /* Look for the `)'.  */
-       cp_parser_require (parser, CPP_CLOSE_PAREN, "`;'");
-
+       cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
+       
        /* Parse the body of the for-statement.  */
        parser->in_iteration_statement_p = true;
        cp_parser_already_scoped_statement (parser);
index 7d915dc7390ab84b7a1ce28d923cb0475ab17dd4..8e29e244f71afdc10a69562ed40d40e5ebe78193 100644 (file)
@@ -5895,22 +5895,18 @@ tsubst_default_argument (tree fn, tree type, tree arg)
        };
      
      we must be careful to do name lookup in the scope of S<T>,
-     rather than in the current class.
-
-     ??? current_class_type affects a lot more than name lookup.  This is
-     very fragile.  Fortunately, it will go away when we do 2-phase name
-     binding properly.  */
-
-  /* FN is already the desired FUNCTION_DECL.  */
+     rather than in the current class.  */
   push_access_scope (fn);
   /* The default argument expression should not be considered to be
      within the scope of FN.  Since push_access_scope sets
      current_function_decl, we must explicitly clear it here.  */
   current_function_decl = NULL_TREE;
 
+  push_deferring_access_checks(dk_no_deferred);
   arg = tsubst_expr (arg, DECL_TI_ARGS (fn),
                     tf_error | tf_warning, NULL_TREE);
-  
+  pop_deferring_access_checks();
+
   pop_access_scope (fn);
 
   /* Make sure the default argument is reasonable.  */
@@ -7423,6 +7419,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
           enumerators.  */
        if (DECL_NAMESPACE_SCOPE_P (t))
          return t;
+       /* If ARGS is NULL, then T is known to be non-dependent.  */
+       if (args == NULL_TREE)
+         return t;
 
        /* Unfortunately, we cannot just call lookup_name here.
           Consider:
index af96cb7c567338173eb3055b09d1747558224dc2..3ffd9c264cbfabea9305373af722e8e44a38f9fd 100644 (file)
@@ -1,3 +1,17 @@
+2004-06-07  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15337
+       * g++.dg/expr/sizeof3.C: New test.
+
+       PR c++/14777
+       * g++.dg/template/access14.C: New test.
+
+       PR c++/15554
+       * g++.dg/template/enum1.C: New test.
+
+       PR c++/15057
+       * g++.dg/eh/throw1.C: New test.
+
 2004-06-07  David Ayers  <d.ayers@inode.at>
            Ziemowit Laski  <zlaski@apple.com>
 
diff --git a/gcc/testsuite/g++.dg/eh/throw1.C b/gcc/testsuite/g++.dg/eh/throw1.C
new file mode 100644 (file)
index 0000000..6a3cb2c
--- /dev/null
@@ -0,0 +1,9 @@
+class S  
+{ 
+public: 
+  S(){} 
+};  
+  
+int foo(char* m1) {  
+  throw (m1 ? S() : S()); 
+} 
diff --git a/gcc/testsuite/g++.dg/expr/sizeof3.C b/gcc/testsuite/g++.dg/expr/sizeof3.C
new file mode 100644 (file)
index 0000000..31338b0
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/15337
+
+class CCC; 
+int main() { sizeof(CCC); return 0; } // { dg-error ".*CCC.*" }
diff --git a/gcc/testsuite/g++.dg/template/access14.C b/gcc/testsuite/g++.dg/template/access14.C
new file mode 100644 (file)
index 0000000..047f925
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/14777
+
+template <typename T>
+struct B
+{
+protected:
+  typedef int M;
+};
+
+template <typename T>
+struct A : B<T> {
+  typedef typename B<T>::M N;
+  A (int = N ());
+};
+
+A<int> a = A<int> ();
diff --git a/gcc/testsuite/g++.dg/template/enum1.C b/gcc/testsuite/g++.dg/template/enum1.C
new file mode 100644 (file)
index 0000000..eaeb12c
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/15554
+
+template <int n> struct T1 { enum { N = 3 }; };
+template <int n> struct T2 { enum { N = 3, N1 = T1<N>::N }; };
+