1*38679fd6SReka Kovacs //RUN: %clang_analyze_cc1 -analyzer-checker=debug.AnalysisOrder -analyzer-config debug.AnalysisOrder:EndFunction=true %s 2>&1 | FileCheck %s 2*38679fd6SReka Kovacs 3*38679fd6SReka Kovacs // At the end of a function, we can only obtain a ReturnStmt if the last 4*38679fd6SReka Kovacs // CFGElement in the CFGBlock is either a CFGStmt or a CFGAutomaticObjDtor. 5*38679fd6SReka Kovacs noReturnStmt()6*38679fd6SReka Kovacsvoid noReturnStmt() {} 7*38679fd6SReka Kovacs 8*38679fd6SReka Kovacs struct S { 9*38679fd6SReka Kovacs S(); 10*38679fd6SReka Kovacs ~S(); 11*38679fd6SReka Kovacs }; 12*38679fd6SReka Kovacs dtorAfterReturnStmt()13*38679fd6SReka Kovacsint dtorAfterReturnStmt() { 14*38679fd6SReka Kovacs S s; 15*38679fd6SReka Kovacs return 0; 16*38679fd6SReka Kovacs } 17*38679fd6SReka Kovacs endsWithReturnStmt()18*38679fd6SReka KovacsS endsWithReturnStmt() { 19*38679fd6SReka Kovacs return S(); 20*38679fd6SReka Kovacs } 21*38679fd6SReka Kovacs 22*38679fd6SReka Kovacs // endsWithReturnStmt() 23*38679fd6SReka Kovacs // CHECK: EndFunction 24*38679fd6SReka Kovacs // CHECK-NEXT: ReturnStmt: yes 25*38679fd6SReka Kovacs // CHECK-NEXT: CFGElement: CFGStmt 26*38679fd6SReka Kovacs 27*38679fd6SReka Kovacs // dtorAfterReturnStmt() 28*38679fd6SReka Kovacs // CHECK: EndFunction 29*38679fd6SReka Kovacs // CHECK-NEXT: ReturnStmt: yes 30*38679fd6SReka Kovacs // CHECK-NEXT: CFGElement: CFGAutomaticObjDtor 31*38679fd6SReka Kovacs 32*38679fd6SReka Kovacs // noReturnStmt() 33*38679fd6SReka Kovacs // CHECK: EndFunction 34*38679fd6SReka Kovacs // CHECK-NEXT: ReturnStmt: no 35