[PATCH] [Sema] Handle TypoExpr for function calls correctly

Davide Italiano dccitaliano at gmail.com
Tue Jun 23 15:05:18 PDT 2015


Discussed yesterday with rikka on IRC.
In the example of the test we call CheckFunctionCall with 'a' being a dependent type, C is not able to handle that correctly and we hit an assertion later on in the code.

(gdb) p TheCall->dump()
CallExpr 0x807dc07e0 'double'
|-ImplicitCastExpr 0x807dc07c8 'double (*)(double)' <FunctionToPointerDecay>
| `-DeclRefExpr 0x807dc0750 'double (double)' Function 0x807d6b8c0 'fabs' 'double (double)'
`-TypoExpr 0x807dc0790 '<dependent type>' lvalue

Force a call to CorrectDelayedTypoExpr() before we go through checkFunctionCall() to avoid the issue.
Do this only in !C++ because C++ is able ho handle dependent types properly.

http://reviews.llvm.org/D10670

Files:
  lib/Sema/SemaExpr.cpp
  test/Sema/typo-builtin-crash.c

Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp
+++ lib/Sema/SemaExpr.cpp
@@ -5063,6 +5063,15 @@
 
   // Do special checking on direct calls to functions.
   if (FDecl) {
+    if (!getLangOpts().CPlusPlus) {
+      // C cannot handle TypoExpr nodes because it
+      // doesn't handle dependent types properly.
+      ExprResult Result = CorrectDelayedTyposInExpr(TheCall);
+      if (!Result.isUsable() || !isa<CallExpr>(Result.get()))
+        return ExprError();
+      TheCall = cast<CallExpr>(Result.get());
+    }
+
     if (CheckFunctionCall(FDecl, TheCall, Proto))
       return ExprError();
 
Index: test/Sema/typo-builtin-crash.c
===================================================================
--- test/Sema/typo-builtin-crash.c
+++ test/Sema/typo-builtin-crash.c
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+int main(void)
+{
+  fabs(a);  // expected-error {{undeclared identifier 'a'}} \
+            // expected-warning {{implicitly declaring library function 'fabs' with type 'double (double)'}} \
+            // expected-warning {{include the header <math.h> or explicitly provide a declaration for 'fabs'}}
+  return (0);
+}

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10670.28293.patch
Type: text/x-patch
Size: 1240 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150623/0bea3d48/attachment.bin>


More information about the cfe-commits mailing list