OSDN Git Service

PR c++/15337
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Jun 2004 15:54:15 +0000 (15:54 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Jun 2004 15:54:15 +0000 (15:54 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82693 138bc75d-0d04-0410-961f-82ee72b054a4

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 98dd016..200b595 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 4b2b355..89bc80e 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 5bb506e..6dfe64a 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 79f1dfa..69813d3 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 0c94f71..d094d30 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 7d915dc..8e29e24 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 af96cb7..3ffd9c2 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 }; };
+