Author: lattner
Date: Fri Jul 25 19:20:22 2008
New Revision: 54082

URL: http://llvm.org/viewvc/llvm-project?rev=54082&view=rev
Log:
improve handling of the horrible GCC objc extension that treats "<foo>" 
like "id<foo>".  This 1) fixes an infinite loop in the parser on things
like "short<foo>" 2) emits a warning about this bogus construct and 3)
changes the testcase to be substantially reduced.

Added:
    cfe/trunk/test/Sema/objc-protocol-1.m
Removed:
    cfe/trunk/test/Sema/bogus-gcc-protocol-extension.m
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticKinds.def
    cfe/trunk/lib/Parse/ParseDecl.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticKinds.def
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticKinds.def?rev=54082&r1=54081&r2=54082&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticKinds.def (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticKinds.def Fri Jul 25 19:20:22 2008
@@ -401,6 +401,9 @@
      "attributes may not be specified on a category")
 DIAG(err_objc_missing_end, ERROR,
      "missing @end")
+DIAG(warn_objc_protocol_qualifier_missing_id, WARNING,
+     "protocol qualifiers without 'id' is archaic")
+
 DIAG(err_objc_illegal_visibility_spec, ERROR,
      "illegal visibility specification")
 DIAG(err_objc_illegal_interface_qual, ERROR,

Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=54082&r1=54081&r2=54082&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Fri Jul 25 19:20:22 2008
@@ -430,6 +430,7 @@
       }
       // FALL THROUGH.
     default:
+    DoneWithDeclSpec:
       // If this is not a declaration specifier token, we're done reading decl
       // specifiers.  First verify that DeclSpec's are consistent.
       DS.Finish(Diags, PP.getSourceManager(), getLang());
@@ -552,20 +553,27 @@
       isInvalid = DS.SetFunctionSpecInline(Loc, PrevSpec);
       break;
       
-    // Gross GCC-ism that we are forced support. FIXME: make an extension?
     case tok::less:
-      if (!DS.hasTypeSpecifier()) {
-        SourceLocation endProtoLoc;
+      // GCC supports types like "<SomeProtocol>" as a synonym for
+      // "id<SomeProtocol>".  This is hopelessly old fashioned and dangerous,
+      // but we support it.
+      if (DS.hasTypeSpecifier())
+        goto DoneWithDeclSpec;
+        
+      {
+        SourceLocation EndProtoLoc;
         llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
-        ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc);
+        ParseObjCProtocolReferences(ProtocolRefs, EndProtoLoc);
         llvm::SmallVector<DeclTy *, 8> *ProtocolDecl = 
                 new llvm::SmallVector<DeclTy *, 8>;
         DS.setProtocolQualifiers(ProtocolDecl);
         Actions.FindProtocolDeclaration(Loc, 
-                  &ProtocolRefs[0], ProtocolRefs.size(),
-                  *ProtocolDecl);
+                                        &ProtocolRefs[0], ProtocolRefs.size(),
+                                        *ProtocolDecl);
+        Diag(Loc, diag::warn_objc_protocol_qualifier_missing_id,
+             SourceRange(Loc, EndProtoLoc));
+        continue;
       }
-      continue;
     }
     // If the specifier combination wasn't legal, issue a diagnostic.
     if (isInvalid) {

Removed: cfe/trunk/test/Sema/bogus-gcc-protocol-extension.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/bogus-gcc-protocol-extension.m?rev=54081&view=auto

==============================================================================
--- cfe/trunk/test/Sema/bogus-gcc-protocol-extension.m (original)
+++ cfe/trunk/test/Sema/bogus-gcc-protocol-extension.m (removed)
@@ -1,300 +0,0 @@
-// RUN: clang -fsyntax-only -verify %s
-typedef struct objc_selector *SEL;
-typedef signed char BOOL;
-typedef int NSInteger;
-typedef unsigned int NSUInteger;
-typedef struct _NSZone NSZone;
[EMAIL PROTECTED] NSInvocation, NSMethodSignature, NSCoder, NSString, 
NSEnumerator;
[EMAIL PROTECTED] NSObject
-- (BOOL)isEqual:(id)object;
-- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSCopying
-- (id)copyWithZone:(NSZone *)zone;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSMutableCopying
-- (id)mutableCopyWithZone:(NSZone *)zone;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSCoding
-- (void)encodeWithCoder:(NSCoder *)aCoder;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSObject <NSObject> {}
-
-- (void)dealloc;
[EMAIL PROTECTED]
-
-extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
-
-typedef struct _NSSize {} NSRect;
-typedef struct {} NSFastEnumerationState;
-
[EMAIL PROTECTED] NSFastEnumeration
-- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state 
objects:(id *)stackbuf count:(NSUInteger)len;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSString;
[EMAIL PROTECTED] NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>  
-- (NSUInteger)length;
-- (BOOL)isEqualToString:(NSString *)aString;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSSimpleCString : NSString {} @end
-
[EMAIL PROTECTED] NSConstantString : NSSimpleCString @end
-
-extern void *_NSConstantStringClassReference;
-
[EMAIL PROTECTED] NSSet : NSObject <NSCopying, NSMutableCopying, NSCoding, 
NSFastEnumeration>
-- (NSUInteger)count;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSMutableSet : NSSet
-- (void)addObject:(id)object;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSArray, NSDictionary, NSMapTable;
[EMAIL PROTECTED] NSResponder : NSObject <NSCoding> {} @end
-
[EMAIL PROTECTED] NSAnimatablePropertyContainer    
-- (id)animator;
[EMAIL PROTECTED]
-
-extern NSString *NSAnimationTriggerOrderIn ;
[EMAIL PROTECTED] NSView : NSResponder  <NSAnimatablePropertyContainer> {} @end
-
-extern NSString * const NSFullScreenModeAllScreens;
-typedef NSUInteger NSControlTint;
-
[EMAIL PROTECTED] NSCell : NSObject <NSCopying, NSCoding> {}
-- (NSRect)imageRectForBounds:(NSRect)theRect;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSValidatedUserInterfaceItem
-- (SEL)action;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSUserInterfaceValidations
-- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)anItem;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSCell, NSFont, NSTextView, NSNotification, 
NSAttributedString, NSFormatter;
[EMAIL PROTECTED] NSControl : NSView {} @end
-
[EMAIL PROTECTED] NSColor, NSClipView, NSRulerView, NSScroller;
[EMAIL PROTECTED] NSWindowController : NSResponder <NSCoding> {} @end
-
[EMAIL PROTECTED] NSTableHeaderView;
[EMAIL PROTECTED] NSTableColumn;
[EMAIL PROTECTED] NSTableView : NSControl <NSUserInterfaceValidations> {}
-
-- (NSInteger)columnWithIdentifier:(id)identifier;
-- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSButtonCell;
[EMAIL PROTECTED] NSOutlineView : NSTableView {}
-- (NSInteger)rowForItem:(id)item;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] NSArray, NSDictionary, NSMutableArray, NSNotification, 
NSString, NSToolbarItem, NSWindow;
[EMAIL PROTECTED] XCProxyObjectProtocol
-- (id) representedObject;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXObject : NSObject {} @end
-typedef enum
-{
-    PBXNoItemChanged = 0x00,     PBXProjectItemChanged = 0x01,     
PBXReferenceChanged = 0x02,     PBXGroupChanged = 0x04,     PBXTargetChanged = 
0x08,     PBXBuildPhaseChanged = 0x10,     PBXBuildFileChanged = 0x20,     
PBXBreakpointChanged = 0x40,
-}
-
-PBXChangedItemMask;
[EMAIL PROTECTED] PBXChangeNotification 
-- (void)willChange;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXContainer, PBXProject;
[EMAIL PROTECTED] PBXContainerItem : PBXObject <PBXChangeNotification> {} @end
-
[EMAIL PROTECTED] PBXProjectItem : PBXContainerItem {} @end
-
[EMAIL PROTECTED] XCObjectGraphPath;
[EMAIL PROTECTED] XCCompatibilityChecking  
-- (void)findFeaturesInUseAndAddToSet:(NSMutableSet *)featureSet 
usingPathPrefix:(XCObjectGraphPath *)pathPrefix;
-- (NSString *)identifier;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] XCConfigurationInspectables <NSObject> 
-- (NSString *)name;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXProject, PBXFileReference, PBXBuildPhase, 
PBXBuildSettingsDictionary, PBXExecutable, PBXBuildFile, PBXTargetDependency, 
PBXBuildLog, PBXBuildRule, XCCommandLineToolSpecification, 
XCProductTypeSpecification, PBXPackageTypeSpecification, PBXTargetBuildContext, 
XCBuildConfiguration, XCConfigurationList, XCHeadersBuildPhaseDGSnapshot, 
XCResourcesBuildPhaseDGSnapshot, XCSourcesBuildPhaseDGSnapshot, 
XCFrameworksBuildPhaseDGSnapshot, XCRezBuildPhaseDGSnapshot, 
XCJavaArchiveBuildPhaseDGSnapshot, XCBuildFileRefDGSnapshot, XCWorkQueue, 
XCBuildOperation, XCStringList, XCPropertyExpansionContext, 
XCWorkQueueOperation, XCTargetDGSnapshot, XCTargetHeadermapCreationInfo, 
XCPropertyInfoContext, XCConfigurationInspectionContext, PBXReference;
[EMAIL PROTECTED] PBXTarget : PBXProjectItem <XCCompatibilityChecking, 
XCConfigurationInspectables> {} @end
-
-extern NSString * const XCTargetDGSnapshotContextKey_BuildAction;
[EMAIL PROTECTED] PBXBookmarkItem : PBXProjectItem {} @end
-
[EMAIL PROTECTED] PBXReference : PBXContainerItem {} @end
-
-extern BOOL PBX_getUsesTabsPreference();
[EMAIL PROTECTED] PBXGroup : PBXReference <XCCompatibilityChecking> {} @end
-
[EMAIL PROTECTED] PBXFileReference, PBXTarget, PBXProject;
[EMAIL PROTECTED] PBXExecutable : PBXProjectItem {} @end
-
[EMAIL PROTECTED] XCSCMRevisionInfo;
[EMAIL PROTECTED] PBXBookmark : PBXBookmarkItem {} @end
-
[EMAIL PROTECTED] XCSCMInfo;
[EMAIL PROTECTED] PBXFileReference : PBXReference {} @end
-
[EMAIL PROTECTED] PBXLegacyTarget : PBXTarget {} @end
-
[EMAIL PROTECTED] PBXVariantGroup : PBXGroup {} @end
-
-typedef enum
-{
-    PBXBuildMessageType_None,     PBXBuildMessageType_Notice,     
PBXBuildMessageType_Warning,     PBXBuildMessageType_Error,
-}
-
-PBXBuildMessageType;
[EMAIL PROTECTED] PBXBuildMessage : NSObject {} @end
-
[EMAIL PROTECTED] PBXBreakpoint, PBXFileReference, PBXProject, PBXTextBookmark;
[EMAIL PROTECTED] PBXMarkerDelegateProtocol <NSObject>
-- (void) setLineNumber:(NSUInteger)newLineNumber;
[EMAIL PROTECTED]
-
-typedef enum
-{
-    PBXBreakpointIgnoreCountType = 0,  PBXBreakpointMultipleCountType
-}
-
-PBXBreakpointCountType;
-
[EMAIL PROTECTED] PBXBreakpoint : PBXProjectItem {} @end
[EMAIL PROTECTED] PBXFileBreakpoint : PBXBreakpoint <NSCopying, 
PBXMarkerDelegateProtocol> {} @end
-
-extern NSString *XCBreakpointActionsWereUpdated;
[EMAIL PROTECTED] PBXNodeEditingProtocol
-- (BOOL) canRename;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] XCFosterParentHostProtocol
-- (void) reloadDataForProxies;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXBuildLogItem : NSObject {} @end
-
[EMAIL PROTECTED] PBXBuildLogMessageItem : PBXBuildLogItem {} @end
-
-extern NSString *PBXWindowDidChangeFirstResponderNotification;
[EMAIL PROTECTED] PBXModule : NSWindowController {} @end
-typedef enum
-{
-    PBXPanelCanChooseFiles,     PBXPanelCanChooseFolders,     
PBXPanelCanChooseBoth,     PBXPanelCanChooseOnlyExistingFolders
-}
-
-PBXPanelSelection;
[EMAIL PROTECTED] XCSelection : NSResponder {} @end
-
[EMAIL PROTECTED] XCSelectionSource
-- (XCSelection *) xcSelection;
[EMAIL PROTECTED]
-typedef enum
-{
-    PBXFindMatchContains,     PBXFindMatchStartsWith,     
PBXFindMatchWholeWords,     PBXFindMatchEndsWith
-}
-
-PBXFindMatchStyle;
[EMAIL PROTECTED] PBXSelectableText
-- (NSString *)selectedString;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXFindableText <PBXSelectableText>  
-- (BOOL)findText:(NSString *)string ignoreCase:(BOOL)ignoreCase 
matchStyle:(PBXFindMatchStyle)matchStyle backwards:(BOOL)backwards 
wrap:(BOOL)wrap;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXProjectDocument, PBXProject, PBXAttributedStatusView;
[EMAIL PROTECTED] PBXProjectModule : PBXModule <PBXFindableText> {} @end
-
[EMAIL PROTECTED] PBXExtendedOutlineView, PBXFileReference, PBXGroup, 
PBXProject, PBXProjectDocument, PBXReference, PBXOutlineDataSourceSplitter, 
XCSCMInfo;
-extern NSString * const PBXGroupTreeMainColumnIdentifier;
[EMAIL PROTECTED] PBXGroupTreeModule : PBXProjectModule {} @end
-
[EMAIL PROTECTED] PBXTableColumnProvider  
-- (NSArray *) optionalColumnIdentifiers:(NSTableView *)tableView;
[EMAIL PROTECTED]
-
-extern NSString *PBXSmartGroupTreeModuleColumnsKey;
[EMAIL PROTECTED] PBXSmartGroupTreeModule : PBXGroupTreeModule 
<PBXTableColumnProvider, XCSelectionSource, XCFosterParentHostProtocol> {} @end
-
[EMAIL PROTECTED] PBXBookmark, PBXProjectModule, PBXProjectDocument, 
PBXSmartGroupTreeModule, PBXBreakpoint, XCBreakpointsBucket, PBXFileNavigator;
[EMAIL PROTECTED] PBXFosterParent : PBXGroup <XCProxyObjectProtocol, 
PBXNodeEditingProtocol> {} @end
-
[EMAIL PROTECTED] NSString, NSAttributedString, PBXBookmark, PBXFileDocument, 
PBXSymbol, PBXDocBookmark;
[EMAIL PROTECTED] PBXFindResult : NSObject {} @end
-
[EMAIL PROTECTED] PBXBookmarkSupport
-- (PBXBookmark *) bookmark;
[EMAIL PROTECTED]
-
[EMAIL PROTECTED] PBXReference (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXBookmark (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXFileReference (BookmarkSupportAPI) <PBXBookmarkSupport> 
@end
-
[EMAIL PROTECTED] PBXTarget (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXLegacyTarget (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXExecutable (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXFosterParent (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXVariantGroup (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXFindResult (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXBuildMessage (BookmarkSupportAPI) <PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXBuildLogMessageItem (BookmarkSupportAPI) 
<PBXBookmarkSupport> @end
-
[EMAIL PROTECTED] PBXFileBreakpoint (BookmarkSupportAPI) <PBXBookmarkSupport> 
@end
-
-extern BOOL PBXShouldIncludeReference(id ref);
[EMAIL PROTECTED] PBXSmartGroupDataSource, PBXModule, PBXSmartGroupBinding, 
PBXProjectModule, PBXFosterParent, PBXExtendedOutlineView, PBXOutlineViewCell, 
PBXProjectWorkspaceModule;
[EMAIL PROTECTED] XCOutlineViewCheckBoxProtocol
-- (void) toggleEnabledState;
-- (void) storeCheckBoxBounds:(NSRect)bounds;
[EMAIL PROTECTED]
-
-extern NSControlTint _NSDefaultControlTint(void);
[EMAIL PROTECTED] PBXSmartGroupTreeModule
-- (void) dealloc
-{
-    [super dealloc];
-}
-
-- (void)outlineView:(NSOutlineView *)outlineView 
willDisplayCell:(PBXOutlineViewCell *)cell forTableColumn:(NSTableColumn 
*)tableColumn item:(id)item
-{
-    if ([[tableColumn identifier] isEqualToString: 
PBXGroupTreeMainColumnIdentifier])
-    {
-        if ([item conformsToProtocol:@protocol(XCOutlineViewCheckBoxProtocol)])
-        {
-            NSInteger columnIndex = [outlineView 
columnWithIdentifier:[tableColumn identifier]];
-            NSInteger row = [outlineView rowForItem:item];
-            <XCOutlineViewCheckBoxProtocol> xxx;
-            if (row > -1 && columnIndex > -1)
-            {
-                // FIXME: need to associate the correct type with this.
-                [(<XCOutlineViewCheckBoxProtocol>)item 
storeCheckBoxBounds:[cell imageRectForBounds:[outlineView 
frameOfCellAtColumn:columnIndex row:row]]]; // expected-error{{bad receiver 
type 'int'}}
-            }
-        }
-    }
-}
-

Added: cfe/trunk/test/Sema/objc-protocol-1.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/objc-protocol-1.m?rev=54082&view=auto

==============================================================================
--- cfe/trunk/test/Sema/objc-protocol-1.m (added)
+++ cfe/trunk/test/Sema/objc-protocol-1.m Fri Jul 25 19:20:22 2008
@@ -0,0 +1,10 @@
+// RUN: clang -fsyntax-only -verify %s
+
[EMAIL PROTECTED] SomeProtocol
[EMAIL PROTECTED]
+
+void foo(id x) {
+  bar((short<SomeProtocol>)x); // expected-error {{expected ')'}} 
expected-error {{to match this '('}}
+  bar((<SomeProtocol>)x);      // expected-warning {{protocol qualifiers 
without 'id' is archaic}}
+}
+


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to