[PATCH] Emit diagnostic on illegal calling convention

John McCall rjmccall at apple.com
Tue Apr 16 17:12:34 PDT 2013


On Apr 15, 2013, at 11:01 AM, Alexander Zinenko <ftynse at gmail.com> wrote:
> Finally moved this to SemaType and added more tests for pointers to function appearing within other declarations.
> Could you, please, look at this?

This is the right general idea, thanks!

+  int ChunkIndex = state.getCurrentChunkIndex();
+  while (ChunkIndex != 0 &&
+         D.getTypeObject(ChunkIndex).Kind == DeclaratorChunk::Paren)
+    ChunkIndex--;

Isn't the current ChunkIndex always a DeclaratorChunk::Function?
I think you want D.getTypeObject(ChunkIndex - 1) here, although I guess
I might be off-by-one somehow.

+  bool IsCXXMethod =
+      D.getTypeObject(ChunkIndex).Kind == DeclaratorChunk::MemberPointer;
+
+  // Non-friend functions declared in member context are methods.
+  IsCXXMethod = IsCXXMethod || (D.getContext() == Declarator::MemberContext
+                                && D.isFunctionDeclarator()
+                                && !D.getDeclSpec().isFriendSpecified());

I think the right thing to do here is more like:
  bool IsCXXMethod;
  if (ChunkIndex == 0) { // CC applies to the function being declared
    assert(D.isFunctionDeclarator());
    IsCXXMethod = (D.getContext() == Declarator::MemberContext && !D.getDeclSpec().isFriendSpecified() && D.getDeclSpec().getStorageClassSpecifier() != SC_Static);
  } else {
    IsCXXMethod = D.getTypeObject(ChunkIndex - 1).Kind == DeclaratorChunk::MemberPointer;
  }

For out-of-line method declarations, we should just be able rely on redeclaration checking.

John.



More information about the cfe-commits mailing list