]> granicus.if.org Git - clang/commitdiff
Fix crash on noreturn conversion in unprototyped function type. Thanks to Keith
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Oct 2016 00:01:36 +0000 (00:01 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 20 Oct 2016 00:01:36 +0000 (00:01 +0000)
Walker for spotting the bug.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284673 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/Sema/initialize-noreturn.c

index 0c7ef74a248a577a12f06617ff28d7d030951744..db97f3d57f55117d2541a3402669d8b9e0a5101f 100644 (file)
@@ -1432,7 +1432,7 @@ bool Sema::IsFunctionConversion(QualType FromType, QualType ToType,
   const auto *FromFn = cast<FunctionType>(CanFrom);
   FunctionType::ExtInfo FromEInfo = FromFn->getExtInfo();
 
-  const auto *ToFn = dyn_cast<FunctionProtoType>(CanTo);
+  const auto *ToFn = cast<FunctionType>(CanTo);
   FunctionType::ExtInfo ToEInfo = ToFn->getExtInfo();
 
   bool Changed = false;
@@ -1445,7 +1445,7 @@ bool Sema::IsFunctionConversion(QualType FromType, QualType ToType,
 
   // Drop 'noexcept' if not present in target type.
   if (const auto *FromFPT = dyn_cast<FunctionProtoType>(FromFn)) {
-    const auto *ToFPT = dyn_cast<FunctionProtoType>(ToFn);
+    const auto *ToFPT = cast<FunctionProtoType>(ToFn);
     if (FromFPT->isNothrow(Context) && !ToFPT->isNothrow(Context)) {
       FromFn = cast<FunctionType>(
           Context.getFunctionType(FromFPT->getReturnType(),
index b90d46d6beb04a8dfca8b8d263c05ac91a71c78f..21ff29585ff96002ae88307ac6fbc28254ecb5e9 100644 (file)
@@ -4,13 +4,24 @@
 typedef void (*Fn_noret)(void) __attribute__((noreturn));
 typedef void (*Fn_ret)(void);
 
+typedef void (*Fn_noret_noproto)() __attribute__((noreturn));
+typedef void (*Fn_ret_noproto)();
+
 void foo(void);
 void foo_noret(void)  __attribute__((noreturn));
 
+void foo_noproto();
+void foo_noret_noproto()  __attribute__((noreturn));
+
 void test() {
   Fn_noret fn2 = &foo; // expected-warning {{incompatible function pointer types initializing 'Fn_noret'}}
   Fn_noret fn3 = &foo_noret; 
   Fn_ret fn4 = &foo_noret; 
   Fn_ret fn5 = &foo;
+
+  Fn_noret_noproto fn6 = &foo_noproto; // expected-warning {{incompatible function pointer types initializing 'Fn_noret_noproto'}}
+  Fn_noret_noproto fn7 = &foo_noret_noproto; 
+  Fn_ret_noproto fn8 = &foo_noret_noproto; 
+  Fn_ret_noproto fn9 = &foo_noproto;
 }