[PATCH] D47503: Sema: Add a warning for member pointers with incomplete base types.

Peter Collingbourne via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue May 29 15:58:49 PDT 2018


pcc created this revision.
pcc added reviewers: rnk, rsmith.

Codebases that need to be compatible with the Microsoft ABI can enable
this warning to avoid issues caused by the lack of a fixed ABI for
incomplete member pointers.


https://reviews.llvm.org/D47503

Files:
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/lib/Sema/SemaType.cpp
  clang/test/SemaCXX/warn-incomplete-member-pointers.cpp


Index: clang/test/SemaCXX/warn-incomplete-member-pointers.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaCXX/warn-incomplete-member-pointers.cpp
@@ -0,0 +1,4 @@
+// RUN: %clang_cc1 -verify -fsyntax-only -Wincomplete-member-pointers %s
+
+struct S; // expected-note {{forward declaration of 'S'}}
+typedef int S::*foo; // expected-warning {{member pointer has incomplete base type 'S'}}
Index: clang/lib/Sema/SemaType.cpp
===================================================================
--- clang/lib/Sema/SemaType.cpp
+++ clang/lib/Sema/SemaType.cpp
@@ -2448,6 +2448,12 @@
     return QualType();
   }
 
+  // FIXME: This will cause errors if template instantiation fails.
+  if (!Context.getDiagnostics().isIgnored(diag::warn_memptr_incomplete, Loc) &&
+      !Class->isDependentType() &&
+      !Class->getAsCXXRecordDecl()->isBeingDefined())
+    RequireCompleteType(Loc, Class, diag::warn_memptr_incomplete);
+
   // Adjust the default free function calling convention to the default method
   // calling convention.
   bool IsCtorOrDtor =
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6476,6 +6476,9 @@
 def err_bad_memptr_lhs : Error<
   "left hand operand to %0 must be a %select{|pointer to }1class "
   "compatible with the right hand operand, but is %2">;
+def warn_memptr_incomplete : Warning<
+  "member pointer has incomplete base type %0">,
+  InGroup<DiagGroup<"incomplete-member-pointers">>, DefaultIgnore;
 def warn_exception_caught_by_earlier_handler : Warning<
   "exception of type %0 will be caught by earlier handler">,
   InGroup<Exceptions>;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47503.148999.patch
Type: text/x-patch
Size: 1815 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180529/8b56833c/attachment-0001.bin>


More information about the cfe-commits mailing list