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