Is there any better codepath we could use that would reuse the checking for non-member functions?<br><br>How does this interact with templates?<br><br><div>On Sun Jan 05 2014 at 11:15:36 PM, Saleem Abdulrasool <<a href="mailto:compnerd@compnerd.org">compnerd@compnerd.org</a>> wrote:</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  Avoid double diagnostics generation for constructors.<br>
<br>
Hi rsmith,<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D2514" target="_blank">http://llvm-reviews.chandlerc.<u></u>com/D2514</a><br>
<br>
CHANGE SINCE LAST DIFF<br>
  <a href="http://llvm-reviews.chandlerc.com/D2514?vs=6361&id=6362#toc" target="_blank">http://llvm-reviews.chandlerc.<u></u>com/D2514?vs=6361&id=6362#toc</a><br>
<br>
Files:<br>
  lib/Sema/SemaExprCXX.cpp<br>
  test/Analysis/PR18393.cpp<br>
<br>
Index: lib/Sema/SemaExprCXX.cpp<br>
==============================<u></u>==============================<u></u>=======<br>
--- lib/Sema/SemaExprCXX.cpp<br>
+++ lib/Sema/SemaExprCXX.cpp<br>
@@ -4946,6 +4946,13 @@<br>
   bool IsDecltype = ExprEvalContexts.back().<u></u>IsDecltype;<br>
   CXXDestructorDecl *Destructor = IsDecltype ? 0 : LookupDestructor(RD);<br>
<br>
+  if (!IsDecltype && RD->isAbstract() && !isa<CXXConstructExpr>(E)) {<br>
+    Diag(E->getExprLoc(), diag::err_abstract_type_in_<u></u>decl)<br>
+      << Sema::AbstractReturnType << RT->desugar();<br>
+    DiagnoseAbstractType(RD);<br>
+    return Owned(E);<br>
+  }<br>
+<br>
   if (Destructor) {<br>
     MarkFunctionReferenced(E-><u></u>getExprLoc(), Destructor);<br>
     CheckDestructorAccess(E-><u></u>getExprLoc(), Destructor,<br>
Index: test/Analysis/PR18393.cpp<br>
==============================<u></u>==============================<u></u>=======<br>
--- /dev/null<br>
+++ test/Analysis/PR18393.cpp<br>
@@ -0,0 +1,26 @@<br>
+// RUN: %clang_cc1 -fsyntax-only -verify %s<br>
+// PR18393<br>
+<br>
+struct base {<br>
+  virtual void method() = 0;<br>
+  // expected-note@-1 {{unimplemented pure virtual method 'method' in 'base'}}<br>
+};<br>
+<br>
+struct derived : base {<br>
+  virtual void method();<br>
+};<br>
+<br>
+struct holder {<br>
+  holder() : d_() {}<br>
+  base get() const { return d_; }<br>
+  const derived d_;<br>
+};<br>
+<br>
+void function(const base &);<br>
+<br>
+void test() {<br>
+  holder h;<br>
+  function(h.get());<br>
+  // expected-error@-1 {{return type 'base' is an abstract class}}<br>
+}<br>
+<br>
______________________________<u></u>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-commits</a><br>
</blockquote>