Q:

Error al llamar funciones

El programa consiste en acertar la loteria y luego acertar otro premio.
El problema es al declarar la funcion felicitaciones(). Al llamar a esta desde el main me da error y si la llamo al final de la funcion loteria(), no se ejecuta pero no salta error.
#include <iostream>
#include <fstream>

using namespace std;

bool loteria();
void felicitaciones(bool premio,bool bonus);

int main()
{
    loteria();
    return 0;
}

bool loteria()
{
    int num,num2;
    bool premio,bonus;
    cout<<"Introduce un numero del 1 al 9:";
    cin >> num;

    if(num==8)
    {
        cout <<endl<< "Premio"<<endl;
        premio=true;
    }else
    {
        cout << "Nada";
        return 0;
    }

    cout << "Si acierta de nuevo se lleva un bonus:";
    cin >> num2;

     if(num2==1)
    {
        cout << endl<<"Bonus"<<endl;
        bonus=true;
        return premio,bonus;
    }else
    {
        cout << "Nada";
        bonus=false;
        return premio,bonus;
    }
    felicitaciones(premio,bonus);
}

void felicitaciones(bool premio, bool bonus)
{
    if(premio==true && bonus==true)
    {
        cout << "Usted es un afortunado";
    }
    else
    {
        cout << "No tiene mucha suerte";
    }
}

A:

Tu código tiene algún que otro fallo:

No puedes poner esa especie de doble return, ya que sólo va a devolver una sola cosa. Si necesitas devolver más de un elemento, te aconsejo que uses otro tipo de estructura, bien un TAD, o bien, que uno sea devuelto, y el otro, un parámetro pasado por referencia, etc..
No tiene sentido que la función loteria() tenga valor de retorno, porque en tu caso no llegas a usarlo.
No se ejecuta la función felicitaciones porque si te fijas la función *loteria * tiene un valor de retorno si cumple la 2ª condición (num2==1) y sino, dará el retorno la siguiente sentencia else. Ahora bien, tu código sigue, pero no tiene sentido ya que no se llegará a ejecutar ninguna sentencia después de la sentencia return.

Precisamente a nivel sintáctico y lógico la función felicitaciones es correcta. Una posible implementación es la siguiente:
#include <iostream>
#include <fstream>

using namespace std;

void loteria(bool &premio, bool &bonus); // las variables son pasadas por referencia 
void felicitaciones(bool premio,bool bonus);

int main()
{
    bool premio = false;
     bool bonus = false;
    loteria(premio, bonus);
    felicitaciones (premio, bonus);
}

void loteria(bool &premio, bool &bonus)
{
    int num,num2;
    cout<<"Introduce un numero del 1 al 9:";
    cin >> num;

    if(num==8)
    {
        cout <<endl<< "Premio"<<endl;
        premio=true;
    }else
    {
        cout << "Nada";
    }

    cout << "Si acierta de nuevo se lleva un bonus:";
    cin >> num2;

     if(num2==1)
    {
        cout << endl<<"Bonus"<<endl;
        bonus=true;
    }else
    {
        cout << "Nada";
    }
}

void felicitaciones(bool premio, bool bonus)
{
    if(premio==true && bonus==true)
    {
        cout << "Usted es un afortunado";
    }
    else
    {
        cout << "No tiene mucha suerte";
    }
}

