Index: objc/objc-act.c
===================================================================
--- objc/objc-act.c     (revision 166670)
+++ objc/objc-act.c     (working copy)
@@ -2530,7 +2530,22 @@ objc_get_protocol_qualified_type (tree interface,
                  : xref_tag (RECORD_TYPE, type));
        }
       else
-        return interface;
+       {
+         /* This case happens when we are given an 'interface' which
+            is not a valid class name.  For example if a typedef was
+            used, and 'interface' really is the identifier of the
+            typedef, but when you resolve it you don't get an
+            Objective-C class, but something else, such as 'int'.
+            This is an error; protocols make no sense unless you use
+            them with Objective-C objects.  */
+         error_at (input_location, "only Objective-C object types can be qualified with a protocol");
+
+         /* Try to recover.  Ignore the invalid class name, and treat
+            the object as an 'id' to silence further warnings about
+            the class.  */
+         type = objc_object_type;
+         is_ptr = true;
+       }
     }
 
   if (protocols)
Index: objc/ChangeLog
===================================================================
--- objc/ChangeLog      (revision 166670)
+++ objc/ChangeLog      (working copy)
@@ -1,3 +1,9 @@
+2010-11-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc-act.c (objc_get_protocol_qualified_type): detect cases
+       where we are asked to attach a protocol to something which is not
+       an Objective-C object type, and produce an error.
+
 2010-11-11  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc-act.c (objc_add_property_declaration): Check that the type
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog (revision 166670)
+++ testsuite/ChangeLog (working copy)
@@ -1,3 +1,12 @@
+2010-11-12  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc/compile/20060406-1.m: Fixed testcase not to try to qualify
+       a pointer to an arbitrary C struct with an Objective-C protocol.
+       Test various valid uses of typedef with Objective-C objects and
+       protocols instead.
+       * objc.dg/invalid-type-1.m: New.
+       * obj-c++.dg/invalid-type-1.m: New.     
+       
 2010-11-12  James Dennett <jdennett@google.com>
 
        PR c++/39415
@@ -114,6 +123,7 @@
        * gfortran.dg/proc_decl_24.f90: New.
 
 2010-11-11  Nicola Pero  <nicola.pero@meta-innovation.com>
+
        * objc.dg/property/at-property-20.m: New.
        * objc.dg/property/synthesize-8.m: New. 
        * obj-c++.dg/property/at-property-20.m: New.
Index: testsuite/objc.dg/invalid-type-1.m
===================================================================
--- testsuite/objc.dg/invalid-type-1.m  (revision 0)
+++ testsuite/objc.dg/invalid-type-1.m  (revision 0)
@@ -0,0 +1,24 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+typedef int Integer;
+
+@class MyClass;
+
+typedef MyClass AClass;
+
+@protocol MyProtocol
+- (void) method;
+@end
+
+Class <MyProtocol> class_object; /* This is fine.  */
+
+id <MyProtocol> object; /* This is fine.  */
+
+AClass <MyProtocol> *object1; /* This is fine.  */
+
+Integer <MyProtocol> *object2; /* { dg-error "only Objective-C object types can be qualified with a protocol" } */
+
+Integer <NonExistingProtocol> *object3; /* { dg-error "only Objective-C object types can be qualified with a protocol" } */
+/* { dg-error "cannot find protocol" "" { target *-*-* } 23 } */
Index: testsuite/obj-c++.dg/invalid-type-1.mm
===================================================================
--- testsuite/obj-c++.dg/invalid-type-1.mm      (revision 0)
+++ testsuite/obj-c++.dg/invalid-type-1.mm      (revision 0)
@@ -0,0 +1,25 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
+/* { dg-do compile } */
+#include <objc/objc.h>
+
+typedef int Integer;
+
+@class MyClass;
+
+typedef MyClass AClass;
+
+@protocol MyProtocol
+- (void) method;
+@end
+
+Class <MyProtocol> class_object; /* This is fine.  */
+
+id <MyProtocol> object; /* This is fine.  */
+
+AClass <MyProtocol> *object1; /* This is fine.  */
+
+Integer <MyProtocol> *object2; /* { dg-error ".Integer. is not a template" } */
+/* { dg-error ".MyProtocol. was not declared in this scope" "" { target *-*-* } 21 } */
+
+Integer <NonExistingProtocol> *object3; /* { dg-error ".Integer. is not a template" } */
+/* { dg-error ".NonExistingProtocol. was not declared in this scope" "" { target *-*-* } 24 } */
Index: testsuite/objc/compile/20060406-1.m
===================================================================
--- testsuite/objc/compile/20060406-1.m (revision 166670)
+++ testsuite/objc/compile/20060406-1.m (working copy)
@@ -1,21 +1,65 @@
-typedef struct
-{
-  void *p;
-} *S;
+/* This test tests typedefs and protocol qualifiers.  */
 
 @protocol O
 - (unsigned)j;
 @end
 
+@interface T
+@end
+
+
+/* First test.  */
+typedef T<O> *S;
+
 @interface I
-+ (unsigned char)T:(S<O>[2])p v:(S<O>)h;
++ (unsigned char)T:(S[2])p
+                 v:(S)h;
 @end
 
 @implementation I
-+ (unsigned char)T:(S<O>[2])p v:(S<O>)h
++ (unsigned char)T:(S[2])p
+                 v:(S)h
 {
   p[0] = (S) 0;
   p[1] = (S) 0;
   return 0;
 }
 @end
+
+
+/* Second test.  */
+typedef T<O> S1;
+
+@interface I1
++ (unsigned char)T1:(S1*[2])p 
+                 v1:(S1*)h;
+@end
+
+@implementation I1
++ (unsigned char)T1:(S1*[2])p
+                 v1:(S1*)h
+{
+  p[0] = (S1*) 0;
+  p[1] = (S1*) 0;
+  return 0;
+}
+@end
+
+
+/* Third test.  */
+typedef T S2;
+
+@interface I2
++ (unsigned char)T1:(S2<O>*[2])p 
+                 v1:(S2<O>*)h;
+@end
+
+@implementation I2
++ (unsigned char)T1:(S2<O>*[2])p
+                 v1:(S2<O>*)h
+{
+  p[0] = (S2<O>*) 0;
+  p[1] = (S2<O>*) 0;
+  return 0;
+}
+@end
