exit_nicely(1);
        }
 
+       /* Complain if neither -f nor -d was specified (except if dumping TOC) */
+       if (!opts->dbname && !opts->filename && !opts->tocSummary)
+       {
+               pg_log_error("one of -d/--dbname and -f/--file must be specified");
+               exit_nicely(1);
+       }
+
        /* Should get at most one of -d and -f, else user is confused */
        if (opts->dbname)
        {
 
        printf(_("\nGeneral options:\n"));
        printf(_("  -d, --dbname=NAME        connect to database name\n"));
-       printf(_("  -f, --file=FILENAME      output file name\n"));
+       printf(_("  -f, --file=FILENAME      output file name (- for stdout)\n"));
        printf(_("  -F, --format=c|d|t       backup file format (should be automatic)\n"));
        printf(_("  -l, --list               print summarized TOC of the archive\n"));
        printf(_("  -v, --verbose            verbose mode\n"));
 
 use Config;
 use PostgresNode;
 use TestLib;
-use Test::More tests => 72;
+use Test::More tests => 74;
 
 my $tempdir       = TestLib::tempdir;
 my $tempdir_short = TestLib::tempdir_short;
 );
 
 command_fails_like(
-       [ 'pg_restore', '-s', '-a' ],
+       [ 'pg_restore' ],
+       qr{\Qpg_restore: error: one of -d/--dbname and -f/--file must be specified\E},
+       'pg_restore: error: one of -d/--dbname and -f/--file must be specified'
+);
+
+command_fails_like(
+       [ 'pg_restore', '-s', '-a', '-f -' ],
        qr/\Qpg_restore: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
        'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together'
 );
        'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
 
 command_fails_like(
-       [ 'pg_restore', '-c', '-a' ],
+       [ 'pg_restore', '-c', '-a', '-f -' ],
        qr/\Qpg_restore: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
        'pg_restore: options -c/--clean and -a/--data-only cannot be used together'
 );
        'pg_dump: invalid output format');
 
 command_fails_like(
-       [ 'pg_restore', '-j', '-1' ],
+       [ 'pg_restore', '-j', '-1', '-f -' ],
        qr/\Qpg_restore: error: invalid number of parallel jobs\E/,
        'pg_restore: invalid number of parallel jobs');
 
 command_fails_like(
-       [ 'pg_restore', '--single-transaction', '-j3' ],
+       [ 'pg_restore', '--single-transaction', '-j3', '-f -' ],
        qr/\Qpg_restore: error: cannot specify both --single-transaction and multiple jobs\E/,
        'pg_restore: cannot specify both --single-transaction and multiple jobs');
 
        'pg_dump: compression level must be in range 0..9');
 
 command_fails_like(
-       [ 'pg_restore', '--if-exists' ],
+       [ 'pg_restore', '--if-exists', '-f -' ],
        qr/\Qpg_restore: error: option --if-exists requires option -c\/--clean\E/,
        'pg_restore: option --if-exists requires option -c/--clean');
 
 command_fails_like(
-       [ 'pg_restore', '-F', 'garbage' ],
+       [ 'pg_restore', '-f -', '-F', 'garbage' ],
        qr/\Qpg_restore: error: unrecognized archive format "garbage";\E/,
        'pg_dump: unrecognized archive format');
 
        'pg_dumpall: option --if-exists requires option -c/--clean');
 
 command_fails_like(
-       [ 'pg_restore', '-C', '-1' ],
+       [ 'pg_restore', '-C', '-1', '-f -' ],
        qr/\Qpg_restore: error: options -C\/--create and -1\/--single-transaction cannot be used together\E/,
        'pg_restore: options -C\/--create and -1\/--single-transaction cannot be used together'
 );